python 超硬核--递归思想解决--24点问题!!!

问题
随意给出四个数字,通过加减乘除四则运算,可以得出24。


算法解决思路:
假设ABCD四个数字

  1. BCD三个数字进行四则运算得到E,然后A与E进行四则运算
  2. AB两个数字进行四则运算的得到E,CD两个数字进行四则运算得到F,然后E和F进行四则运行
  3. ABC三个数字进行四则运算得到E,然后E与D进行四则运算
  4. 判断以上情况得到的结果是否等于24,如果等于,则打印,否则不打印

  1. 随机生产四个数字
#----------------------------------------------------------------------
def get_numbers(num,min_value,max_value):
    """"""
    return list(np.random.randint(min_value,max_value+1,[num]))

返回的结果:

[12, 6, 3, 11]
  1. 对获得的列表进行数据处理
#----------------------------------------------------------------------
def get_2_sets(numbers):
    """"""
    result = []
    for i, num in enumerate(numbers):
        set1 = [num]
        set2 = numbers.copy()
        del set2[i]
        result.append((set1,set2))
    
    if len(numbers) < 4:
        return result
    
    if len(numbers) > 4:
        return Exception(len(numbers))
    
    for i , num in enumerate(numbers):
        for j in range(i+1,len(numbers)):
            set1 = [numbers[i],numbers[j]]
            set2 = numbers.copy()
            del set2[j]
            del set2[i]
            result.append((set1,set2))
    return result

返回的result结果如下:

[([12], [6, 3, 11]), 
([6], [12, 3, 11]), 
([3], [12, 6, 11]), 
([11], [12, 6, 3]), 
([12, 6], [3, 11]), 
([12, 3], [6, 11]), 
([12, 11], [6, 3]), 
([6, 3], [12, 11]), 
([6, 11], [12, 3]), 
([3, 11], [12, 6])]
  1. 对获得的列表进行四则运算
#----------------------------------------------------------------------
def make_result(numbers):
    """"""
    if len(numbers) == 1:
        return [(numbers[0], str(numbers[0]))]
    
    result = []
    for set1,set2 in get_2_sets(numbers):
        result1 = make_result(set1)
        result2 = make_result(set2)
        for value1 , s1 in result1:
            for value2, s2 in result2:
                result.append((value1+value2,f"({s1})+({s2})"))
                result.append((value1*value2,f"({s1})*({s2})"))
                result.append((value1-value2,f"({s1})-({s2})"))
                if value2 != 0:
                    result.append((value1 / value2,f"({s1})/({s2})"))
                result.append((value2-value1,f"({s2})-({s1})"))
                if value1 != 0:
                    result.append((value2 / value1 , f"({s2})/({s1})"))
    return result  

运行结果如下:

(12)+((6)+((3)+(11)))
(12)*((6)+((3)+(11)))
(12)-((6)+((3)+(11)))
(12)/((6)+((3)+(11)))
((6)+((3)+(11)))-(12)
((6)+((3)+(11)))/(12)
(12)+((6)*((3)+(11)))
(12)*((6)*((3)+(11)))
(12)-((6)*((3)+(11)))
(12)/((6)*((3)+(11)))
((6)*((3)+(11)))-(12)
((6)*((3)+(11)))/(12)
(12)+((6)-((3)+(11)))
(12)*((6)-((3)+(11)))
(12)-((6)-((3)+(11)))
(12)/((6)-((3)+(11)))
((6)-((3)+(11)))-(12)
((6)-((3)+(11)))/(12)
(12)+((6)/((3)+(11)))
(12)*((6)/((3)+(11)))
(12)-((6)/((3)+(11)))
(12)/((6)/((3)+(11)))
((6)/((3)+(11)))-(12)
((6)/((3)+(11)))/(12)
(12)+(((3)+(11))-(6))
(12)*(((3)+(11))-(6))
(12)-(((3)+(11))-(6))
(12)/(((3)+(11))-(6))
(((3)+(11))-(6))-(12)
(((3)+(11))-(6))/(12)
(12)+(((3)+(11))/(6))
(12)*(((3)+(11))/(6))
(12)-(((3)+(11))/(6))
(12)/(((3)+(11))/(6))
(((3)+(11))/(6))-(12)
(((3)+(11))/(6))/(12)
(12)+((6)+((3)*(11)))
(12)*((6)+((3)*(11)))
(12)-((6)+((3)*(11)))
(12)/((6)+((3)*(11)))
((6)+((3)*(11)))-(12)
((6)+((3)*(11)))/(12)
(12)+((6)*((3)*(11)))
(12)*((6)*((3)*(11)))
(12)-((6)*((3)*(11)))
(12)/((6)*((3)*(11)))
((6)*((3)*(11)))-(12)
((6)*((3)*(11)))/(12)
(12)+((6)-((3)*(11)))
(12)*((6)-((3)*(11)))
(12)-((6)-((3)*(11)))
(12)/((6)-((3)*(11)))
((6)-((3)*(11)))-(12)
((6)-((3)*(11)))/(12)
(12)+((6)/((3)*(11)))
(12)*((6)/((3)*(11)))
(12)-((6)/((3)*(11)))
(12)/((6)/((3)*(11)))
((6)/((3)*(11)))-(12)
((6)/((3)*(11)))/(12)
(12)+(((3)*(11))-(6))
(12)*(((3)*(11))-(6))
(12)-(((3)*(11))-(6))
(12)/(((3)*(11))-(6))
(((3)*(11))-(6))-(12)
(((3)*(11))-(6))/(12)
(12)+(((3)*(11))/(6))
(12)*(((3)*(11))/(6))
(12)-(((3)*(11))/(6))
(12)/(((3)*(11))/(6))
(((3)*(11))/(6))-(12)
(((3)*(11))/(6))/(12)
(12)+((6)+((3)-(11)))
(12)*((6)+((3)-(11)))
(12)-((6)+((3)-(11)))
(12)/((6)+((3)-(11)))
((6)+((3)-(11)))-(12)
((6)+((3)-(11)))/(12)
(12)+((6)*((3)-(11)))
(12)*((6)*((3)-(11)))
(12)-((6)*((3)-(11)))
(12)/((6)*((3)-(11)))
((6)*((3)-(11)))-(12)
((6)*((3)-(11)))/(12)
(12)+((6)-((3)-(11)))
(12)*((6)-((3)-(11)))
(12)-((6)-((3)-(11)))
(12)/((6)-((3)-(11)))
((6)-((3)-(11)))-(12)
((6)-((3)-(11)))/(12)
(12)+((6)/((3)-(11)))
(12)*((6)/((3)-(11)))
(12)-((6)/((3)-(11)))
(12)/((6)/((3)-(11)))
((6)/((3)-(11)))-(12)
((6)/((3)-(11)))/(12)
(12)+(((3)-(11))-(6))
(12)*(((3)-(11))-(6))
(12)-(((3)-(11))-(6))
(12)/(((3)-(11))-(6))
(((3)-(11))-(6))-(12)
(((3)-(11))-(6))/(12)
(12)+(((3)-(11))/(6))
(12)*(((3)-(11))/(6))
(12)-(((3)-(11))/(6))
(12)/(((3)-(11))/(6))
(((3)-(11))/(6))-(12)
(((3)-(11))/(6))/(12)
(12)+((6)+((3)/(11)))
... ...
# 此处省略10368行
  1. 判断运算的结果是否是24
def make_24(numbers):
    """"""
    res = []
    count = 0
    for value,s in make_result(numbers):
        print(s)
        count += 1
        if value == 24:
            res.append(s)
    print(count)
    return res

运行结果为:

answers=['(12)*(((11)-(3))-(6))', '(12)*(((11)-(3))-(6))', '(12)*(((11)-(6))-(3))', '(12)*(((11)-(6))-(3))', '(12)*((11)-((6)+(3)))', '(12)*((11)-((3)+(6)))', '(6)*((12)+((3)-(11)))', '(6)*((12)-((11)-(3)))', '(6)*((12)-((11)-(3)))', '(6)*((12)+((3)-(11)))', '(6)*((3)+((12)-(11)))', '(6)*((3)-((11)-(12)))', '(6)*((3)-((11)-(12)))', '(6)*((3)+((12)-(11)))', '(6)*(((12)+(3))-(11))', '(6)*(((3)+(12))-(11))']


整体代码如下:

#-*- coding:utf-8 -*-
import numpy as np

#----------------------------------------------------------------------
def get_2_sets(numbers):
    result = []
    for i, num in enumerate(numbers):
        set1 = [num]
        set2 = numbers.copy()
        del set2[i]
        result.append((set1,set2))
    
    if len(numbers) < 4:
        return result
    
    if len(numbers) > 4:
        return Exception(len(numbers))
    
    for i , num in enumerate(numbers):
        for j in range(i+1,len(numbers)):
            set1 = [numbers[i],numbers[j]]
            set2 = numbers.copy()
            del set2[j]
            del set2[i]
            result.append((set1,set2))
    return result
    
#----------------------------------------------------------------------
def make_result(numbers):
    if len(numbers) == 1:
        return [(numbers[0], str(numbers[0]))]
    
    result = []
    for set1,set2 in get_2_sets(numbers):
        result1 = make_result(set1)
        result2 = make_result(set2)
        for value1 , s1 in result1:
            for value2, s2 in result2:
                result.append((value1+value2,f"({s1})+({s2})"))
                result.append((value1*value2,f"({s1})*({s2})"))
                result.append((value1-value2,f"({s1})-({s2})"))
                if value2 != 0:
                    result.append((value1 / value2,f"({s1})/({s2})"))
                result.append((value2-value1,f"({s2})-({s1})"))
                if value1 != 0:
                    result.append((value2 / value1 , f"({s2})/({s1})"))
    return result             
    
#----------------------------------------------------------------------
def make_24(numbers):
    res = []
    count = 0
    for value,s in make_result(numbers):
        print(s)
        count += 1
        if value == 24:
            res.append(s)
    return res
    
#----------------------------------------------------------------------
def get_numbers(num,min_value,max_value):
    """"""
    return list(np.random.randint(min_value,max_value+1,[num]))

    
if __name__ == "__main__":
    numbers = get_numbers(4,1,13)
    print(numbers)
    answers = make_24(numbers)
    print(f"answers={answers}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹏AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值