24点游戏的递归解法和Python实现

article/2025/10/24 9:55:34

24点游戏的递归解法和Python实现

目录

  • 24点游戏的递归解法和Python实现
    • 什么是24点游戏
    • 递归思路
      • 递归
      • 24点问题的递归思路
    • Python代码实现
    • 四则运算下无解的组合
    • 总结


什么是24点游戏

还记得小时候拿一副牌玩得24点游戏吗?

拿一副牌,抽去大小王后(J,Q,K记为11,12,13;用1代替A),剩下1~13这52张牌。任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号,高级玩家也可用其他运算符号)把牌面上的数算成24。每张牌必须用且只能用一次。如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3=24。

下面就介绍一种求解24点问题的递归思路以及给出其Python求解代码。


递归思路

递归

递归的思路便是把大的问题变小,每一步将原先要求解的问题分解成与原问题相似的规模较小的问题更小的问题,直至最后达到一个满足退出条件的简单问题,这样再一层层向上返回,便解决了原先的大规模的问题。在代码实现中,程序不断调用自身,每次调用都使问题规模变小,最后达到退出条件一层层返回直至解决原先的问题。

构成递归需具备的条件:
1.子问题须与原始问题为同样的事,且更为简单;
2.不能无限制地调用本身,须有个出口,化简为非递归状况处理。

理解它的一个非常好的例子便是阶乘。n的阶乘(记为fact(n))定义为:
n ! = ∏ i = 1 n i = n ∗ ( n − 1 ) ∗ ( n − 2 ) . . . ∗ 1 n!=\prod_{i=1}^{n}i=n*(n-1)*(n-2)...*1 n!=i=1ni=n(n1)(n2)...1
它可以通过递归方式定义为:
若n=1 , 则fact(n)=1;
若n为大于1的整数,则fact(n)=n*fact(n-1)
这相当于给了一个退出条件(n=1的情况),和一个把问题分解为更小的同类型问题的方法(求n的阶乘变为求n乘上n-1的阶乘)。很容易验证,这样的递归定义和其本身的定义是一致的,而递归定义很容易用通过函数调用自身的程序代码实现。

24点问题的递归思路

24点问题也是同理
用四张牌求出24点也许没那么容易,但如果只有两个数,那么我们可以很容易地通过不同的运算符(例:加减乘除)得到两个数组合之后的结果。因此两个数的24点问题是一目了然的。
那么三个数呢?对于三个数a,b,c,我们可以从其中任意挑选两个数(三种挑选方式),例如a,b,之后通过加减乘除计算得到a与b组合后的数d(如果只有四则运算,a与b一定时d有a*b,a+b,a-b,b-a,a/b,b/a几种可能,当然除法首先要求分母不为0),那么d确定了之后问题便变成c与d算24点的两数问题,它们是否能得出24是一目了然的。于是对一个个分支(及所有可能的c和d)进行尝试,便能判断三个数能否以及如何得出24点。
四个数当然也可以以同样的方法变为多个三数问题,进而变成两数问题输出结果。
当然如果不止四个数也可以以同样的方法一步步使问题变小,直至缩小成两数问题达到递归的返回条件。

于是我们的算法求解如下:
1.一个将两个数a,b通过运算组合成新的数的函数f(a,b)
此函数输入两个数a,b,输出它们四则运算的各种对应解及其运算符。
例如输入(a,b),输出a+b的结果及加号,a-b的结果及减号…
2.递归主程序
输入牌组,判断牌组长度,若为两数问题则通过f(a,b)判断能否算出24点并返回;若牌组长度大于2则任选两个数a,b;调用函数f(a,b),将其输出的数存储在一个新的牌组中(此数所对应的运算符即为当前的解决方案分支),新的牌组长度比原先的长度减一,解这个新的牌组的24点问题。

函数的Python实现
1.一个将两个数a,b通过运算组合成新的数的函数f(a,b)
在Python中可以以一个列表的形式很容易地将输出存储起来,即输入(a,b)两个数,f(a,b)返回[(a+b,’+’),(a-b,’-’),…],这里方括号代表列表,括号代表元祖的数据结构,它将运算结果和其对应的运算符放在一起。运算结果对应的运算符用字符(即’+’,’-’,…)进行输出。
2.递归主程序
牌组可用列表来保存,并记录当前列表长度用来判断,用一个全局的数组记录求解过程,即在每一个递归分支中,保存使用过的数,组合成新数的运算符等。

将牌组记为列表A,全局的数组(当前求解过程)记为temp,初始问题大小记为N,当前问题大小记为n,则主程序可以用一张图加以说明:
递归主程序

Python代码实现

cal24.py中代码如下:

#交换a与b
def swap(a,b):temp=aa=bb=tempreturn a,b# +:0, -:1, *:2, /:3
#in:two number
#out:a tuple with result and its operator
def f(a,b):#让a>=bif(a<b):a,b=<

http://chatgpt.dhexx.cn/article/Rjhbd5Qu.shtml

相关文章

Python实现24点游戏

问题描述 24点游戏是经典的纸牌益智游戏。 常见游戏规则&#xff1a; 从扑克中每次取出4张牌。使用加减乘除&#xff0c;第一个能得出24者为赢。&#xff08;其中&#xff0c;J代表11&#xff0c;Q代表12&#xff0c;K代表13&#xff0c;A代表1&#xff09;&#xff0c;按照要…

用python算24点及原理详解

1 描述 给出4个正整数&#xff0c;使用加、减、乘、除4种运算以及括号把4个数连接起来得到一个结果等于24的表达式。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬…

24点卡牌游戏C++实现

问题描述&#xff1a; 24点游戏是经典的纸牌益智游戏。 常见游戏规则&#xff1a; 从扑克中每次取出4张牌。使用加减乘除&#xff0c;第一个能得出24者为赢。&#xff08;其中&#xff0c;J代表11&#xff0c;Q代表12&#xff0c;K代表13&#xff0c;A代表1&#xff09;&#x…

Python 小程序:计算24点

今天玩24点的时候&#xff0c;突然希望想编写一个 计算24点的小程序&#xff0c;为python的初学者提供一些帮助。 24点是许多人都会玩的游戏。玩法在这里简单的介绍一下&#xff1a;选4个数字&#xff08;1-13中任意&#xff09;&#xff0c;然后用加减乘除算出24。计算时&…

24点答案生成器

故事背景&#xff1a;晚上拿起扑克牌&#xff0c;奈何没有牌友&#xff0c;百度了一下有什么单人扑克游戏&#xff0c;然后就发现了24点&#xff0c;随意挑出4张牌&#xff0c;只用加减乘除组合成24点&#xff0c;我抽出了7 7 8 Q(12) &#xff0c;然后思索了半天没有答案&…

蓝桥杯 试题 算法训练 24点 C++ 详解

问题描述&#xff1a; 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数字&#xff08;其中A代表1&#xff0c;J代表11&#xff0c;Q代表12&#xff0c;K代表13&#xff09;&#xff0c;你可以利用数学中…

24点游戏(python)

24点游戏&#xff08;python&#xff09; 一、题目要求 1.问题描述&#xff1a; 24点游戏是经典的纸牌益智游戏。常见游戏规则&#xff1a; 从扑克中每次取出4张牌。使用加减乘除&#xff0c;第一个能得出24者为赢。&#xff08;其中&#xff0c;J代表11&#xff0c;Q代表12&a…

用java实现24点游戏

前言 用java实现24点游戏 Welocome to Xiang’s world~ 题目ღ( &#xff65;ᴗ&#xff65; ) 24点游戏是经典的纸牌益智游戏。 常见游戏规则&#xff1a; 从扑克中每次取出4张牌。使用加减乘除&#xff0c;第一个能得出24者为赢。&#xff08;其中&#xff0c;J代表11&am…

C++ 实现计算24点

原理 暴力枚举所有的情况&#xff0c;运算符号4个&#xff0c;加减乘除 - * / &#xff0c;整数数字4个&#xff08;易扩展为5个数或者更多&#xff09;。所需要枚举的次数&#xff1a; 数字顺序&#xff1a;4个数的全排列&#xff0c;4! 24。运算符号&#xff1a;4个数需要…

计算机上的24点游戏怎么玩,趣味算数二十四点游戏规则怎么玩技巧

概述&#xff1a;这是一个算数游戏&#xff0c;用四张牌计算得出24。 时间&#xff1a;20分钟 人数&#xff1a;集体参与 目的&#xff1a;锻炼学员的快速计算能力。 道具&#xff1a;扑克牌 步骤&#xff1a; 1.去点大小王&#xff0c;“K”计13点&#xff0c;“Q”计12点&…

【编程|二十四点】关于编程解决二十四点的两种思路

【编程心得系列*24点】 写在前面&#xff1a;编程心得系列不谈具体问题的代码&#xff0c;只谈解决思路。 这是一个关于二十四点的软件。属于典型的先有目的再有初衷的软件。 在此之前我倒是写过一个解数独的软件。但那个的核心代码部分毕竟是抄袭的。这次是觉得对自己更有信…

计算机二十四点游戏怎么玩,扑克牌二十四点怎么玩?扑克牌二十四点游戏规则介绍...

扑克牌二十四点是在国际上很流行的一种扑克游戏玩法&#xff0c;因为游戏计算性较强&#xff0c;较为考验的玩家的心算能力&#xff0c;所以很受扑克玩家的喜爱&#xff0c;那么扑克牌二十四点到底是怎么玩的呢&#xff1f;扑克牌二十四点的游戏规则又是什么呢&#xff1f;下面…

CCF计算机软件能力认证试题练习:201903-2 二十四点

二十四点 来源&#xff1a;CCF 标签&#xff1a; 参考资料&#xff1a; 相似题目&#xff1a; 背景 二十四点是一款著名的纸牌游戏&#xff0c;其游戏的目标是使用 3 个加减乘除运算使得 4张纸牌上数字的运算结果为 24。 题目 定义每一个游戏由 4 个从 1-9 的数字和 3 个四则运…

asdasdas

asdasdasdsadassad 阅读全文: http://gitbook.cn/gitchat/activity/5d634f8c5cbc425420e0e72f 您还可以下载 CSDN 旗下精品原创内容社区 GitChat App &#xff0c;阅读更多 GitChat 专享技术内容哦。

dsada

图2.2 www.sina.com网站系统采用的基本上就是图2.2所示的架构&#xff0c;不同地区的人们在访问www.sina.com站点时&#xff0c;浏览器实际上所访问的服务器是不一样的&#xff0c;例如&#xff0c;吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器&#xff0c;湖北…

Asdasd

这里写阿阿萨德斯达四大自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义…

dsa-基础

算法与数据结构 0.概念数据结构复杂度时间复杂度空间复杂度 1. 线性表顺序表(数组)链表单链表双链表循环链表静态链表 顺序表/链表栈顺序栈链式栈 队列顺序循环队列链表队列双端队列 2. 递归递归与栈阶乘例子 3. 矩阵对称矩阵三角矩阵稀疏矩阵 4. 字符串 0.概念 数据结构 逻辑…

dsadas

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…