ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 2310|回复: 6

[原创] 递归的运用:24点扑克牌游戏算法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-20 10:53 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:递归
因为业务关系,这段时间逼迫研究递归算法,顺手写了个24点的算法分享给大家
24点游戏递归.rar (11.53 KB, 下载次数: 119)

评分

参与人数 1财富 +20 收起 理由
joforn + 20 值得肯定

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-20 16:54 | 显示全部楼层
递归可以的……我还写过任意个数的数值进行+-*/四则混合运算的递归算法代码。

当然数值个数越多、最后的组合数就越多……输出结果没有意义了。

TA的精华主题

TA的得分主题

发表于 2014-3-21 12:00 | 显示全部楼层
不知道用,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

TA的精华主题

TA的得分主题

发表于 2014-3-21 16:53 | 显示全部楼层
本帖最后由 香川群子 于 2014-3-21 16:55 编辑

我的通用递归计算代码:

理论上可以无限制的n个数进行反复加减乘除的四则混合运算。
但如果n值很大,计算结果越来越多就会死机。
所以实际使用时,请选择2-5个数进行递归计算。

计算目标值也不限制=24,可以输入任意数值(含小数、但不得为负数)
  1. Dim crr(65535, 1), b, cnt&
  2. Sub dg_Calc() 'by kagawa
  3.     Dim i&, n&, tms#
  4.     tms = Timer
  5.    
  6.     n = [a1].End(4).Row - 1
  7.     ReDim arr(1 To n, 1 To 2)
  8.     For i = 1 To n
  9.         arr(i, 1) = Cells(i + 1, 1)
  10.         arr(i, 2) = Cells(i + 1, 1)
  11.     Next
  12.     b = [b2]
  13.    
  14.     cnt = 0: Call zhjs(arr, n)
  15.    
  16.     [d1].CurrentRegion.Offset(1) = ""
  17.     If cnt Then [d2].Resize(cnt, 2) = crr
  18.     MsgBox Format(Timer - tms, "0.000s ") & cnt
  19. End Sub
  20. Sub zhjs(arr(), n&)
  21.     Dim i&, j&, k&, l&, f&
  22.     ReDim brr(1 To n - 1, 1 To 2)
  23.     For i = 1 To n - 1
  24.         For j = i + 1 To n
  25.             If n > 2 Then
  26.                 l = 0
  27.                 For k = 1 To n
  28.                     If k <> i And k <> j Then
  29.                         l = l + 1
  30.                         brr(l, 1) = arr(k, 1)
  31.                         brr(l, 2) = arr(k, 2)
  32.                     End If
  33.                 Next
  34.             End If
  35.             
  36.             For f = 1 To 5
  37.             
  38.                 If f = 4 And arr(i, 1) = 0 Then
  39.                
  40.                 ElseIf f = 5 And arr(j, 1) = 0 Then
  41.                
  42.                 Else
  43.                     brr(n - 1, 1) = js(arr(i, 1), arr(j, 1), f)
  44.                     brr(n - 1, 2) = jg(arr(i, 2), arr(j, 2), f)
  45.                     If n = 2 Then
  46.                         If Round(brr(n - 1, 1), 12) = b Then
  47.                             crr(cnt, 0) = brr(n - 1, 2)
  48.                             crr(cnt, 1) = jg(Round(arr(i, 1), 3), Round(arr(j, 1), 3), f)
  49.                             cnt = cnt + 1
  50.                         End If
  51.                     Else
  52.                         Call zhjs(brr, n - 1)
  53.                     End If
  54.                 End If
  55.             Next
  56.         Next
  57.     Next
  58. End Sub
  59. Function js(n1, n2, f)
  60.     Select Case f
  61.         Case 1
  62.             js = n1 + n2
  63.         Case 2
  64.             If n1 > n2 Then js = n1 - n2 Else js = n2 - n1
  65.         Case 3
  66.             js = n1 * n2
  67.         Case 4
  68.             If n1 = 0 Then js = "!0" Else js = n2 / n1
  69.         Case 5
  70.             If n2 = 0 Then js = "!0" Else js = n1 / n2
  71.     End Select
  72. End Function
  73. Function jg(n1, n2, f)
  74.     Select Case f
  75.         Case 1
  76.             jg = "(" & n1 & "+" & n2 & ")"
  77.         Case 2
  78.             jg = "(" & n2 & "-" & n1 & ")"
  79.         Case 3
  80.             jg = "(" & n1 & "*" & n2 & ")"
  81.         Case 4
  82.             If n1 = 0 Then jg = "/Zero" Else jg = "(" & n2 & "/" & n1 & ")"
  83.         Case 5
  84.             If n2 = 0 Then jg = "/Zero" Else jg = "(" & n1 & "/" & n2 & ")"
  85.     End Select
  86. End Function

复制代码

dg_Calc.zip

16.67 KB, 下载次数: 49

TA的精华主题

TA的得分主题

发表于 2014-3-21 22:44 | 显示全部楼层
虽然是加减乘除四则混合运算,但实际每2个数之间会有5种计算结果。

1. 加法 a+b = b+a 只算1种
2. 减法 a-b = -(b-a) 也只能算1种
3. 乘法 a*b = b*a 只算1种
4. 除法 a/b 和 b/a 不同,要算2种

所以一共是5种不同的结果。

…………
2个数,Combin(2,2)=1种组合,(2-1)次计算即5^(2-1)=5次计算,一共是1*5=5种结果;
3个数,Combin(3,2)=3种组合,(3-1)次计算即5^(3-1)=25次计算,一共是1*3*25=75种结果;
4个数,Combin(4,2)=6种组合,(4-1)次计算即5^(4-1)=125次计算,一共是1*3*6*125=2250种结果;
5个数,Combin(5,2)=10种组合,(5-1)次计算即5^(5-1)=625次计算,一共是1*3*6*10*625=112500种结果;
6个数,Combin(6,2)=15种组合,(6-1)次计算即5^(6-1)=3125次计算,一共是1*3*6*10*15*3125=8437500种结果;
7个数,Combin(7,2)=21种组合,(7-1)次计算即5^(7-1)=15625次计算,一共是1*3*6*10*15*21*15625=885937500种结果;
…………
增长很快的。


总之,如果是4个数进行加减乘除四则混合运算,一共有最大2250种可能的计算结果。

TA的精华主题

TA的得分主题

发表于 2018-10-3 19:16 | 显示全部楼层
香川群子 发表于 2014-3-21 16:53
我的通用递归计算代码:

理论上可以无限制的n个数进行反复加减乘除的四则混合运算。

你的这个代码输入12,13,14,15四个数是错误的。那个文本处理函数没有考虑到,之前数值的大小。

TA的精华主题

TA的得分主题

发表于 2018-10-3 19:21 | 显示全部楼层
香川群子 发表于 2014-3-21 16:53
我的通用递归计算代码:

理论上可以无限制的n个数进行反复加减乘除的四则混合运算。

但是你的思想是对的,跟你学到了很多知识 ,香川妹子。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-10-17 23:48 , Processed in 0.070361 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表