个人是在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")
有不对的地方欢迎指正,祝各位同学学习进步