这个编程之美第一章16题是答案, python代码如下
from __future__ import division
def Point_Game(n,numbers,result,Value):
"Implement 24-point game"
if n==1:
if math.fabs(numbers[0]-Value)<0.0001:
print result[0]
return True
else: return False
for i in range(n):
for j in range(i+1,n):
a,b=numbers[i],numbers[j]
expa,expb=result[i],result[j]
numbers[j]=numbers[n-1]
result[j]=result[n-1]
result[i]='('+expa+'+'+expb+')'
numbers[i]=a+b
if Point_Game(n-1,numbers,result,Value):
return True
result[i]='('+expa+'-'+expb+')'
numbers[i]=a-b
if Point_Game(n-1,numbers,result,Value):
return True
result[i]='('+expb+'-'+expa+')'
numbers[i]=b-a
if Point_Game(n-1,numbers,result,Value):
return True
result[i]='('+expa+'*'+expb+')'
numbers[i]=a*b
if Point_Game(n-1,numbers,result,Value):
return True
if b:
result[i]='('+expa+'/'+expb+')'
numbers[i]=a/b
if Point_Game(n-1,numbers,result,Value):
return True
if a:
result[i]='('+expb+'/'+expa+')'
numbers[i]=b/a
if Point_Game(n-1,numbers,result,Value):
return True
numbers[i]=a
numbers[j]=b
result[i]=expa
result[j]=expb
return False
测试:
numbers=[6,6,6,6]
results=[]
for n in numbers:
results.append(str(n))
Recur.Point_Game(4, numbers, results, 24)
Output:
(((6+6)+6)+6)
测试: numbers=[1,3,4,6]--->(6/(1-(3/4)))
numbers=[3,3,8,8]-->(8/(3-(8/3)))
numbers=[3,3,7,7]-->(((3/7)+3)*7)
测试用例是google最难算的24点
基本idea是back-tracking,这个程序可以在45分钟内写出来吧,欢迎找bug