鱼C论坛

 找回密码
 立即注册
查看: 1326|回复: 14

[已解决]有大佬能给我讲解汉诺塔递归函数么

[复制链接]
发表于 2022-3-7 20:22:02 | 显示全部楼层 |阅读模式
15鱼币
  1. def hanoi(n, x, y, z):
  2.     if n == 1:
  3.         print(x, '-->', z)
  4.     else:
  5.         hanoi(n - 1, x, z, y)  # 把n—1个盘子从x移到y上
  6.         print(x, '-->', z)  # 把第n个盘子移动到z上
  7.         hanoi(n - 1, y, x, z)  # 把y上的n1个盘子移动到z上


  8. n = int(input('输入层数'))
  9. hanoi(n, 'x', 'y', 'z')
复制代码

求助!!!
我去pycharm调试了之后还是没懂怎么算的 QAQ
最佳答案
2022-3-7 20:22:03
本帖最后由 elven08 于 2022-3-7 20:35 编辑

X:起始柱子;Y:过渡柱子;Z:目标柱子。
链条:移动N个从X到Z,先把N-1从X到Y,然后把N从X移动到Z,再把N-1从Y移动到Z。
基例:N-1=1时,从X直接到Z。

最佳答案

查看完整内容

X:起始柱子;Y:过渡柱子;Z:目标柱子。 链条:移动N个从X到Z,先把N-1从X到Y,然后把N从X移动到Z,再把N-1从Y移动到Z。 基例:N-1=1时,从X直接到Z。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-7 20:22:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 elven08 于 2022-3-7 20:35 编辑

X:起始柱子;Y:过渡柱子;Z:目标柱子。
链条:移动N个从X到Z,先把N-1从X到Y,然后把N从X移动到Z,再把N-1从Y移动到Z。
基例:N-1=1时,从X直接到Z。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-7 20:29:09 From FishC Mobile | 显示全部楼层
小甲鱼不是有一期视频么,专门就是汉诺塔
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-7 20:31:52 | 显示全部楼层
X:起始柱子;Y:过渡柱子;Z:目标柱子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-7 20:38:00 | 显示全部楼层
哈哈哈,这个我当年也是想了很久
只能说别被变量的名字所迷惑,把当前 变量x , y ,z 对应的值'x' , 'y', 'z',写出来
就输入三层,拿纸笔好好跟着代码画画,以小见大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-7 20:38:32 | 显示全部楼层
elven08 发表于 2022-3-7 20:34
X:起始柱子;Y:过渡柱子;Z:目标柱子。
链条:移动N个从X到Z,先把N-1从X到Y,然后把N从X移动到Z,再把 ...

过程我倒是清楚怎么移动,我不知道的是代码的算法 以及递归运算~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-7 20:39:09 | 显示全部楼层
qq1151985918 发表于 2022-3-7 20:29
小甲鱼不是有一期视频么,专门就是汉诺塔

我知道,我就是从那里过来的,不懂怎么运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-7 20:41:41 | 显示全部楼层
大马强 发表于 2022-3-7 20:38
哈哈哈,这个我当年也是想了很久
只能说别被变量的名字所迷惑,把当前 变量x , y ,z 对应的值'x' , 'y', ' ...

哈哈 好的 我去试试,应该是是被变量名迷惑住了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-7 20:42:12 | 显示全部楼层
大马强 发表于 2022-3-7 20:38
哈哈哈,这个我当年也是想了很久
只能说别被变量的名字所迷惑,把当前 变量x , y ,z 对应的值'x' , 'y', ' ...

就如同4楼大佬所说,把变量x,y,z分成三个不同功能
x => 移动盘子的柱子
y => 给盘子当过渡的柱子
z => 盘子移动到的柱子

然后带入实际的值,慢慢看就能理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-7 20:46:52 | 显示全部楼层
大马强 发表于 2022-3-7 20:42
就如同4楼大佬所说,把变量x,y,z分成三个不同功能
x => 移动盘子的柱子
y => 给盘子当过渡的柱子

好的 谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-7 20:54:15 | 显示全部楼层
本帖最后由 elven08 于 2022-3-7 21:08 编辑

递归就是一个函数调用自己而已,看看这个有助于你理解!
2.png
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-7 22:50:44 | 显示全部楼层
elven08 发表于 2022-3-7 20:54
递归就是一个函数调用自己而已,看看这个有助于你理解!

好的,谢谢啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-7 22:56:51 | 显示全部楼层
elven08 发表于 2022-3-7 20:54
递归就是一个函数调用自己而已,看看这个有助于你理解!


大佬 图2的绿底数字代表的是什么呀???
是代表的返回值吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-8 01:33:53 | 显示全部楼层
tuza1205 发表于 2022-3-7 22:56
大佬 图2的绿底数字代表的是什么呀???
是代表的返回值吗?

0!=1;
1!=1*0!=1*1=1;
2!=2*1!=2*1=2;
3!=3*2!=3*2=6;
4!=4*3!=4*6=24;
5!=5*4!=5*24=120;
…………
n!=n*(n-1)!
是这样运算的,对编程来说搞清楚“基例”,0!=1;"链条",n!=n*(n-1)!。剩下的就交给计算机。
计算机的计算过程是通过"链条",n!=n*(n-1)!从不断重复调取自己,直到获取“基例”,0!=1,然后返回值,直到算出结果,我这样说清楚了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-8 10:41:03 From FishC Mobile | 显示全部楼层
就是阶乘算法懂了,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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