[Python]N 个数 算 24

需求 :
24点游戏,使用递归的思想解决
任意给出n个数,通过±x%四种方式进行计算24,返回所有的可以计算24的方法

解决思路 :

  1. 使用 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把数据 转成 字典类型
  2. 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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值