穷举算法思想
将问题的所有可能的答案一一列举,然后根据条件判断答案是否合适,保留合适的,丢弃不合适的。
算法步骤:
- 解的可能范围,不能遗漏任何一个真正解,也要避免有重复。
- 判断是否是真正解的方法。
- 使可能解的范围降至最小,以便提高解决问题的效率。
计算 24 点
根据任意 4 个数,4 种运算符(加、减、乘、除),计算 24 点,数字只能用 1 次,运算符可重复使用。
import itertools
def twentyfour(list):
for nums in itertools.permutations(list):
for ops in itertools.product('+-*/', repeat=3):
# 构造四种中缀表达式 (bsd)
bds1 = '({0}{4}{1}){5}({2}{6}{3})'.format(*nums, *ops) # (a+b)*(c-d)
bds2 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*nums, *ops) # ((a+b)*c)-d
bds3 = '{0}{4}({1}{5}({2}{6}{3}))'.format(*nums, *ops) # a/(b-(c/d))
bds4 = '({0}{4}({1}{5}{2})){6}{3}'.format(*nums, *ops) # (a/(b+c))-d
for bds in [bds1, bds2, bds3, bds4]:
try:
if abs(eval(bds) - 24.0) < 1e-10:
return bds
except ZeroDivisionError: # 零除错误
continue
return 'Not found!'
print(twentyfour([1,2,6,90])) # (90/(1+2))-6
计算平方根
计算 2 的平方根,误差精确到 0.0001 内。
x = 2
epsilon = 0.0001
step = epsilon/10
numGuesses = 0
ans = 1
while abs(ans**2 - x) >= epsilon and ans <= x:
ans += step
numGuesses += 1
print('numGuesses =', numGuesses) # numGuesses = 41418
print('ans =', ans) # ans = 1.4141800000027134
网友评论