Python实现判断四个数能否实现24点游戏

个人是在Python的实验课中接触到这道题的,这个题目是递归思想中较难的一种题目了,个人想出来后觉得可以给各位师弟师妹作为一个参考

首先,要判断四个数能否完成24点的游戏,我们玩家正常的思路总是最后得到两个数字,然后将其运算为24,例如,3,3,3,1,(3+1)*(3+3)——>4*6,或者(3*3-1)*3——>8*3,像这样,都是最后得到两个数来进行判断,所以在我们的代码中也是这样一个道理,最后一定是用两个数来实现运算得到24,但你可能会问,那我输入的是4个数字,怎么得到最后的那两个数字呢?

好,现在就需要采取一种递归思路了,因为给你2个数字,比较好运算,但是如果给你3个数字,你要怎么做呢?

答案是:转化为多次2个数字的情况,从给定的3个数字中每次取不同的两个数字进行组合运算,包括加减乘除等,算出来的结果再和刚刚没有被选入的另外一个数字去运算,这时候就是2个数的运算了,例如,2,4,3         ——>选取2,4,一系列加减乘除操作,可以将其转化为一个数字,2+4,2-4,2*4,……,再对每个数字和3来组队,看看3能不能和其中的一个数运算得到24,当然了,一共会有3种选取情况(C3 2)

同理如果是4个数字,就可以每次选两个数字,然后得到3个数字的组合,再对3个数字进行上面的操作,就可以判断了,用for 循环即可实现这样的操作,核心思想是化繁为简,逐次调用

最后将两个数字的结果存入列表中,最后来个 if 24 in 列表判断一下,就OK啦

下面是代码部分喔:有注释,可以看看

list4 = []  #定义一个全局列表list4[],用于存放所有由两个数进行的运算的结果
flag = 0    #标识符,如果为1,则说明已经能够算出24点,退出,否则进行递归
def operation(a,b): #定义函数,对选中的两个数进行各种运算操作
    list1 = []  #定义空列表,并且每次调用时都能重新归零
    list1.append(a + b) #将各种运算的结果存入列表中
    list1.append(a - b)
    list1.append(b - a)
    list1.append(a * b)
    if b!=0 :   #进行除法运算时,除数不能为0,所以增加判断条件
        list1.append(a / b)
    if a!=0:
        list1.append(b / a)
    return list1    #返回该列表
def Point24(listorg): 
#定义递归函数,参数为输入的列表,该函数每次调用将减少列表长度(简化问题),直至长度为2
    global flag     #声明使用全局变量标识符
    if flag == 1 :  #判断是否需要递归,若为1,说明已经有结果能够算出24,退出即可
        pass
    else :      #否则要进行递归
        global list4    #声明使用全局变量list4,
        if len(listorg) > 2:    #如果求解列表长度大于2,要进行递归操作
            for i in range(len(listorg)-1): #两个for循环来实现每次取列表中的两个数
                for j in range(i+1,len(listorg)):
                    list2 = [] #list2用于存放选出两个数的各种运算
                    list2 =  operation(listorg[i],listorg[j])
                    for k in list2 :    
#遍历list2中的每个运算结果,将其分别和其他剩余元素到一个新的列表中
                        list3=[]
                        list3.append(k)
                        for m in range(0,len(listorg)) :    #找到剩余元素,加入列表中
                            if m!=i and m!= j :
                                list3.append(listorg[m])
                        Point24(list3)  #递归
        elif len(listorg) == 2:     #如果求解列表长度为2,则开始判断是否能够求解
            list4.extend(operation(listorg[0], listorg[1])) #将这两个数的结果添加进列表中
            if 24 in list4: 
#判断24是否在这个列表中,是则打印True,并且将标识符改为1,下次调用时如果flag=1就直接退出了
                print("True")
                flag =1
            else:
                pass
org =[] #定义空列表
for i in range(4) :     #用for循环来实现对原始数组的赋值
    org.append(int(input()))
Point24(org)    #调用函数
if flag == 0:   #如果flag经过调用函数之后还是为0,说明不能够实现24点,则打印False
    print("False")

有不对的地方欢迎指正,祝各位同学学习进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值