需求 :
24点游戏,使用递归的思想解决
任意给出n个数,通过±x%四种方式进行计算24,返回所有的可以计算24的方法
解决思路 :
- 使用
dict
的方式 生成数据,{'value':value}
的形式,fun1()
函数就是实现了 这个功能,map(str,nums)
,map函数接收两个参数,一个是函数,一个是序列,map(str,nums)
就是把 nums 的list 类型转换成str ,zip(str,float)
函数 是把对应的 两个参数一一 对应起来,生成的对象是list类型,如[('a':a),('b':b),('c':c)]
,dict
把数据 转成 字典类型 - fun 函数
首先判定num数量是不是只有一个,如果只有一个数字了,判定是不是24
如果不是唯一的数量,需要使用循环把nums 里面的数据逐一取出来 ,nums.keys()[i],nums.value[i]
这两个 值 可以取到的键值对
合并了nums
并且是插入数据,同时使用pop
函数 删除已经合并过的数据 ,然后重新调用fun
函数
代码
for i in range(len(nums)):#nums是dict类型的
for j in range(i):
以上的代码实现了遍历所有的数据
代码:
def fun1(nums):
#function map to append a new list
nums0 = dict(zip(map(str,nums),map(float,nums)))
#先把输入的list转换成dict
print 'nums0',nums0
fun(nums0)
#进入fun函数时,nums 已经是dict类型
def fun(nums):
if len(nums) ==1:
#dict 的 长度 是1的时候 ,直接判断是不是
if nums.values()[0] ==24.0:#循环到最后
print 'str',(str(nums.keys()[0])+'='+str(nums.values()[0]))
else:
for i in range(len(nums)):#list里面至少有两个[1,2,3,4]
for j in range(i):
#add
num1 = nums.copy()
num1['('+str(nums.keys()[i])+"+"+str(nums.keys()[j])+')'] = nums.values()[i]+nums.values()[j]
num1.pop(nums.keys()[i])
num1.pop(nums.keys()[j])
fun(num1)
# minus
num1 = nums.copy()
num1['('+str(nums.keys()[i])+'-'+str(nums.keys()[j])+')'] = nums.values()[i]-nums.values()[j]
num1.pop(nums.keys()[i])
num1.pop(nums.keys()[j])
fun(num1)
# multiply
num1 = nums.copy()
#print 'j',j,'i',i
if (j==0 and i==1):
nums.keys()[i],num1.keys()[j]
num1['('+str(nums.keys()[i]+'*'+str(nums.keys()[j]))+')'] = nums.values()[i]*nums.values()[j]
#print 'multiply---num',num1,str(nums.keys()[i]),str(nums.keys()[j])
num1.pop(nums.keys()[i])
num1.pop(nums.keys()[j])
fun(num1)
#divided
if nums.values()[j]!=0:
num1 = nums.copy()
num1['('+str(nums.keys()[i])+'/'+str(nums.keys()[j])+')'] = nums.values()[i]/nums.values()[j]
num1.pop(nums.keys()[i])
num1.pop(nums.keys()[j])
fun(num1)
if nums.values()[i]!=0:
num1 = nums.copy()
num1['('+str(nums.keys()[j])+'/'+str(nums.keys()[i])+')'] = nums.values()[j]/nums.values()[i]
num1.pop(nums.keys()[i])
num1.pop(nums.keys()[j])
fun(num1)
nums = [1,2,3,4,5,7]
#test_count()
fun1(nums)