1234

ExcelHome技术论坛

用户名  找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

帖子
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 183|回复: 6

[分享] 利用递归生成冰雹猜想序列数字

[复制链接]

TA的精华主题

TA的得分主题

发表于 2025-1-24 22:46 | 显示全部楼层 |阅读模式
冰電猜想可以表述为:
对于任意正整数n,
如果n是偶数,则下一步变为n/2;
如果n是奇数,则下一步变为3n+1。
这个过程将不断重复,最终总会得到数字1。
例如,从数字6开始,按照冰電猜想的规则进行计算,可以得到序列:6→3→10→5→16→8→4→2→1。
这个猜想之所以被称为“冰電猜想”,是因为通过计算所产生的数列如果画成一幅折线图,就会一会上一会下,如同在气流中起伏的冰一般,但最终都会坠落地面。


新建公式:F
=LAMBDA(X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,F(X/2)),HSTACK(X,F(X*3+1)))))
单元格公式:=F(6),生成数据如下:
6        3        10        5        16        8        4        2        1


逻辑分析:
第1步:
LAMBDA传递一个参数X,计算表达式为:IF(X=1,1,IF(ISEVEN(X),HSTACK(X,F(X/2)),HSTACK(X,F(X*3+1))))
=IF(X=1,1,IF(ISEVEN(X),HSTACK(X,F(X/2)),HSTACK(X,F(X*3+1))))

第2步:
如果传递值为 X=1 ,返回值为 1,计算结束。


第3步:
如果传递至 X 不等于1,则运行 嵌套的 IF函数 如下:
=IF(ISEVEN(X),HSTACK(X,F(X/2)),HSTACK(X,F(X*3+1)))

第4步:
ISEVEN(X),如果参数X为偶数,返回值:HSTACK(X,F(X/2)),即生成一个行数组,由x 和 F(x/2)组成,因为F就是自定义函数,这里就实现了函数的递归调用,在计算 F(X/2)时,将参数“X/2”传递给LAMBDA函数,即这里再次进行第1步的计算,但是参数变了;


第5步:
                  如果参数X不为偶数,是奇数,返回值:HSTACK(X,F(X*3+1)),即生成一个行数组,由x 和 F(X*3+1)组成,因为F就是自定义函数,这里就实现了函数的递归调用,在计算F(X*3+1)时,将参数“X*3+1”传递给LAMBDA函数,即这里再次进行第1步的计算,但是参数变了;


第6步:在递归调用结束后,将计算出的值依次返回原计算表达式,最终得到结果。



分析
=F(1)
对于lambda函数,代入值1,公式为:
=LAMBDA(1,IF(1=1,1,IF(ISEVEN(1),HSTACK(1,F(1/2)),HSTACK(1,F(1*3+1))))),        结果为计算公式
=IF(1=1,1,IF(ISEVEN(1),HSTACK(1,F(1/2)),HSTACK(1,F(1*3+1)))),1=1 为true
=1


分析
=F(2)
对于lambda函数,代入值2,公式为:
=LAMBDA(2,IF(2=1,1,IF(ISEVEN(2),HSTACK(2,F(2/2)),HSTACK(2,F(2*3+1))))),2=1为false,结果为计算公式
=IF(2=1,1,IF(ISEVEN(2),HSTACK(2,F(2/2)),HSTACK(2,F(2*3+1))),
=IF(ISEVEN(2),HSTACK(2,F(2/2)),HSTACK(1,F(2*3+1)),ISEVEN(2) 为true
=HSTACK(2,F(2/2)) ,
=HSTACK(2,F(1)),        计算F(2)时,又要计算F(1),在计算一个函数的时候又要重新调用该函数,这就是公式的递归调用,或者叫循环引用。从上面分析已知:F(1)=1,代入公式,
=HSTACK(2,1)
结果为
2        1


分析
=F(3)
对于lambda函数,代入值3,公式为:
=LAMBDA(3,IF(3=1,1,IF(ISEVEN(3),HSTACK(3,F(3/2)),HSTACK(3,F(3*3+1))))),3=1为false,结果为计算公式
=IF(3=1,1,IF(ISEVEN(3),HSTACK(3,F(3/2)),HSTACK(3,F(3*3+1))))
=IF(ISEVEN(3),HSTACK(3,F(3/2)),HSTACK(3,F(3*3+1)))
=HSTACK(3,F(3*3+1))
=HSTACK(3,F(10))        ,计算F(10),还是循环调用,道理相同
=HSTACK(3,LAMBDA(10,IF(10=1,1,IF(ISEVEN(10),HSTACK(10,F(10/2)),HSTACK(10,F(10*3+1))))))
=HSTACK(3,IF(10=1,1,IF(ISEVEN(10),HSTACK(10,F(10/2)),HSTACK(10,F(10*3+1)))))
=HSTACK(3,IF(ISEVEN(10),HSTACK(10,F(10/2)),HSTACK(10,F(10*3+1))))
=HSTACK(3,HSTACK(10,F(10/2)))
=HSTACK(3,HSTACK(10,F(5)))        ,计算F(5),还是循环调用,道理相同
=HSTACK(3,HSTACK(10,LAMBDA(5,IF(5=1,1,IF(ISEVEN(5),HSTACK(5,F(5/2)),HSTACK(5,F(5*3+1)))))))
=HSTACK(3,HSTACK(10,IF(5=1,1,IF(ISEVEN(5),HSTACK(5,F(5/2)),HSTACK(5,F(5*3+1))))))
=HSTACK(3,HSTACK(10,IF(ISEVEN(5),HSTACK(5,F(5/2)),HSTACK(5,F(5*3+1)))))
=HSTACK(3,HSTACK(10,HSTACK(5,F(5*3+1))))
=HSTACK(3,HSTACK(10,HSTACK(5,F(16))))                ,计算F(16),还是循环调用,道理相同
=HSTACK(3,HSTACK(10,HSTACK(5,LAMBDA(16,IF(16=1,1,IF(ISEVEN(16),HSTACK(16,F(16/2)),HSTACK(16,F(16*3+1))))))))       
=HSTACK(3,HSTACK(10,HSTACK(5,IF(16=1,1,IF(ISEVEN(16),HSTACK(16,F(16/2)),HSTACK(16,F(16*3+1)))))))
=HSTACK(3,HSTACK(10,HSTACK(5,IF(ISEVEN(16),HSTACK(16,F(16/2)),HSTACK(16,F(16*3+1))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,F(16/2)))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,F(8)))))        ,计算F(8),还是循环调用,道理相同
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,LAMBDA(8,IF(8=1,1,IF(ISEVEN(8),HSTACK(8,F(8/2)),HSTACK(8,F(8*3+1)))))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,IF(ISEVEN(8),HSTACK(8,F(8/2)),HSTACK(8,F(8*3+1))))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,F(8/2)))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,F(4)))))))        ,计算F(4),还是循环调用,道理相同
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,LAMBDA(4,IF(4=1,1,IF(ISEVEN(4),HSTACK(4,F(4/2)),HSTACK(4,F(4*3+1)))))))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,IF(4=1,1,IF(ISEVEN(4),HSTACK(4,F(4/2)),HSTACK(4,F(4*3+1))))))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,IF(ISEVEN(4),HSTACK(4,F(4/2)),HSTACK(4,F(4*3+1)))))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,HSTACK(4,F(4/2))))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,HSTACK(4,F(2))))))))        ,计算F(2),还是循环调用,道理相同,上面计算过 F(2)=HSTACK(2,1)
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,HSTACK(4,HSTACK(2,1)))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,HSTACK(4,2,1))))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,HSTACK(8,4,2,1)))))
=HSTACK(3,HSTACK(10,HSTACK(5,HSTACK(16,8,4,2,1))))
=HSTACK(3,HSTACK(10,HSTACK(5,16,8,4,2,1)))
=HSTACK(3,HSTACK(10,5,16,8,4,2,1))
=HSTACK(3,10,5,16,8,4,2,1)
结果为
3        10        5        16        8        4        2        1


将 LAMBDA函数改为LET函数


lambda函数需要新建一个函数,然后在单元格中去调用公式,步骤多一些,结合使用let函数可以直接在单元格中实现lambda定义的功能。


新建公式:F,引用为:
=LAMBDA(X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,F(X/2)),HSTACK(X,F(X*3+1)))))


改为 LET 公式如下:


=LET(F,LAMBDA(Y,X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,Y(Y,X/2)),HSTACK(X,Y(Y,X*3+1))))),F(F,C16))

=LET(F,LAMBDA(牛,X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,牛(牛,X/2)),HSTACK(X,牛(牛,X*3+1))))),F(F,C16))


分析:
LET函数有3个参数
参数1:F,定义了一个名称
参数2:LAMBDA(Y,X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,Y(Y,X/2)),HSTACK(X,Y(Y,X*3+1)))))  ,为名称 F 的值或计算表达式
参数3:F(F,C16),是一个 使用了 F 的计算表达式
LET参数返回结果为 最后一个参数,这里就是参数3对应的表达式,假设查找数值为4,则


=F(F,4),调用了名称F,传递了两个参数 F 和 4,代入到名称F对应 计算表达式,LAMBDA函数参数 Y=F,X=4
=LAMBDA(Y,X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,Y(Y,X/2)),HSTACK(X,Y(Y,X*3+1)))))
=LAMBDA(F,4,IF(4=1,1,IF(ISEVEN(4),HSTACK(X,F(F,4/2)),HSTACK(X,F(F,4*3+1)))))
=IF(4=1,1,IF(ISEVEN(4),HSTACK(4,F(F,4/2)),HSTACK(4,F(F,4*3+1))))
=IF(ISEVEN(4),HSTACK(4,F(F,4/2)),HSTACK(4,F(F,4*3+1)))
=HSTACK(4,F(F,4/2))
=HSTACK(4,F(F,2)) , 调用了名称F,传递了两个参数 F 和 2,代入到名称F对应 计算表达式,LAMBDA函数参数 Y=F,X=2
=HSTACK(4,LAMBDA(Y,X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,Y(Y,X/2)),HSTACK(X,Y(Y,X*3+1))))))
=HSTACK(4,LAMBDA(F,2,IF(2=1,1,IF(ISEVEN(2),HSTACK(2,F(F,2/2)),HSTACK(2,F(F,2*3+1))))))
=HSTACK(4,IF(2=1,1,IF(ISEVEN(2),HSTACK(2,F(F,2/2)),HSTACK(2,F(F,2*3+1)))))
=HSTACK(4,IF(ISEVEN(2),HSTACK(2,F(F,2/2)),HSTACK(2,F(F,2*3+1))))
=HSTACK(4,HSTACK(2,F(F,2/2)))
=HSTACK(4,HSTACK(2,F(F,1))) , 调用了名称F,传递了两个参数 F 和 1,代入到名称F对应 计算表达式,LAMBDA函数参数 Y=F,X=1
=HSTACK(4,HSTACK(2,LAMBDA(Y,X,IF(X=1,1,IF(ISEVEN(X),HSTACK(X,Y(Y,X/2)),HSTACK(X,Y(Y,X*3+1)))))))
=HSTACK(4,HSTACK(2,IF(1=1,1,IF(ISEVEN(1),HSTACK(1,F(F,1/2)),HSTACK(1,F(F,1*3+1)))))) ,IF条件表达式 1=1,返回值1
=HSTACK(4,HSTACK(2,1))
=HSTACK(4,2,1)
={4,2,1}



冰雹序列.gif

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2025-1-24 23:16 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-1-24 23:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-1-24 23:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-1-25 00:44 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2025-1-25 08:48 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Screenshot_20250125_004215_com.microsoft.office.officehub.jpg

TA的精华主题

TA的得分主题

发表于 2025-1-25 20:08 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

1234

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

GMT+8, 2025-2-3 13:59 , Processed in 0.027999 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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