鱼C论坛

 找回密码
 立即注册
查看: 2625|回复: 2

[作品展示] 递归看的有些晕,可以参考这个#汉诺塔

[复制链接]
发表于 2023-1-13 00:48:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
所谓的递归是自己调用自己并且给出返回条件
但是有些朋友看着递归程序没有办法理解,可以采用我的方法:始终要区分实参和形参所对应的数值,可以解析程序运行过程,逐步扩展理解,以汉诺塔为例
以n = 3为例
def hanoi(n,x,y,z):                                                                                              hanoi(3, X(x) , Y(y) , Z(z))                       #*  *号在这里哦
    if n == 1:
        print(x ,'-->',z)
    else:
        hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上                 (1)                                       hanoi(2, X(x) , Z(y) , Y(z))           #    hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上    这个hanoi中的x,z,y 分别与*步骤的hanoi赋值对应
                                                                                                                                                                                   即x == X, y == Y, z ==Z  因此在调用自身的时候改变了第二次调用时形参x,y,z所对应的值
                                                                                                                                                                                   即x == X, y == Z, z == Y
                                                                                                                                        hanoi(1, X(x) , Y(y), Z(z))
                                                                                                                                                print('X --> Z')
                                                                                                                                        print('X --> Y')                   #属于上一个解释的执行hanoi()函数中(2)
                                                                                                                                        hanoi(1, Z(x), X(y), Y(z))     #属于上上一个解释的执行hanoi()函数中的(3)
                                                                                                                                                print('Z --> Y')            #至此(1)过程结束,下一个与此相同
        print(x,'-->',z) #将最底下的最后一个盘子从x移动到z上    (2)                                  print ('X --> Y')
        hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上                 (3)                                  hanoi(2, Y(x), X(y), Z(z))
                                                                                                                                        hanoi(1, Y(x), Z(y), X(z))
                                                                                                                                                print('Y --> X')
                                                                                                                                        print('Y --> Z')
                                                                                                                                        hanoi(1, X(x), Y(y), Z(z))
                                                                                                                                                print('X --> Z')       


n = int(input('请输入塔诺塔的层数:'))
hanoi(n,'X','Y','Z')

这个程序很神奇,我很想知道这个是按照怎样的想法写出来的,欢迎大家评论区留言告诉我,虽然小甲鱼说了原理,但是还是不知道递归该怎么写(上面实我想了想写了写理解的,只会理解不会写QAQ)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-13 09:00:17 | 显示全部楼层
代码请用代码格式,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-13 19:32:18 | 显示全部楼层
coolplaylin 发表于 2023-1-13 09:00
代码请用代码格式,谢谢。

尴尬,本来设置好的,提交格式就变了。最左侧都是代码的原本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 23:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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