汉诺塔问题

Harryjing2018 2020-02-06 10:55:20

def move(n, a, b, c):
if n == 1:
print('move', a, '-->', c)
else:
move(n-1, a, c, b) #这后面我有点看不明白
move(1, a, b, c)
move(n-1, b, a, c)

move(4, 'A', 'B', 'C')

这个是怎么用到递归呢?
f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,



...全文
190 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hajo_ 2020-02-07
  • 打赏
  • 举报
回复
引用 2 楼 Harryjing2018的回复:
[quote=引用 1 楼 chuifengde 的回复:] 这个是这么理解的: 你的定义是move(n,a,b,c) 表示的意思是n个盘从a柱借助b柱移到c柱。 if n == 1 表示只有一个盘,此时直将这个盘从a柱移到c柱,即直接打印a--->c else 将所有的盘分成两部分,最下面一个大的和上面一个小的,只不过此时上面一个小的是由n-1个盘组成的 移两个盘怎么移? 1.先将上面的"小的",也就是n-1个盘从a柱借助c柱移到b上 即代码中的move(n-1,a,c,b) ,这个要递归 2.再将最下面的大的从a柱借助b柱移到c柱 即代码中的move(1,a,b,c) 此时就是n==1的情况 3.最后再将上面1中b上的"小的",也就是n-1个盘从b柱借助a移到c上,即代码中的move(n-1,b,a,c) 这个要递归
move(n-1, a, c, b)     #我觉得应该是直接把a移到b,不需要c
        move(1, a, b, c)   #我觉得应该是直接a移到c,不需要b
        move(n-1, b, a, c) #我觉得应该是直接b移到c,不需要b
我觉得应该是以下这样的;好象不需借要助样;我是哪里没有理解到?
move(n-1, a,  b)  
        move(1, a,  c)
        move(n-1, b,  c)
[/quote] 如果是这样,那你现在写的就不是递归了,递归函数是要引用函数本身,参数的个数,位置也保持一致
Hajo_ 2020-02-07
  • 打赏
  • 举报
回复
引用 2 楼 Harryjing2018的回复:
[quote=引用 1 楼 chuifengde 的回复:] 这个是这么理解的: 你的定义是move(n,a,b,c) 表示的意思是n个盘从a柱借助b柱移到c柱。 if n == 1 表示只有一个盘,此时直将这个盘从a柱移到c柱,即直接打印a--->c else 将所有的盘分成两部分,最下面一个大的和上面一个小的,只不过此时上面一个小的是由n-1个盘组成的 移两个盘怎么移? 1.先将上面的"小的",也就是n-1个盘从a柱借助c柱移到b上 即代码中的move(n-1,a,c,b) ,这个要递归 2.再将最下面的大的从a柱借助b柱移到c柱 即代码中的move(1,a,b,c) 此时就是n==1的情况 3.最后再将上面1中b上的"小的",也就是n-1个盘从b柱借助a移到c上,即代码中的move(n-1,b,a,c) 这个要递归
move(n-1, a, c, b)     #我觉得应该是直接把a移到b,不需要c
        move(1, a, b, c)   #我觉得应该是直接a移到c,不需要b
        move(n-1, b, a, c) #我觉得应该是直接b移到c,不需要b
我觉得应该是以下这样的;好象不需借要助样;我是哪里没有理解到?
move(n-1, a,  b)  
        move(1, a,  c)
        move(n-1, b,  c)
[/quote] 如果是这样,那你现在写的就不是递归了,递归函数是要是函数本身,参数的个数,位置也一样。
chuifengde 2020-02-06
  • 打赏
  • 举报
回复
这个是这么理解的: 你的定义是move(n,a,b,c) 表示的意思是n个盘从a柱借助b柱移到c柱。 if n == 1 表示只有一个盘,此时直将这个盘从a柱移到c柱,即直接打印a--->c else 将所有的盘分成两部分,最下面一个大的和上面一个小的,只不过此时上面一个小的是由n-1个盘组成的 移两个盘怎么移? 1.先将上面的"小的",也就是n-1个盘从a柱借助c柱移到b上 即代码中的move(n-1,a,c,b) ,这个要递归 2.再将最下面的大的从a柱借助b柱移到c柱 即代码中的move(1,a,b,c) 此时就是n==1的情况 3.最后再将上面1中b上的"小的",也就是n-1个盘从b柱借助a移到c上,即代码中的move(n-1,b,a,c) 这个要递归
Harryjing2018 2020-02-06
  • 打赏
  • 举报
回复
引用 1 楼 chuifengde 的回复:
这个是这么理解的: 你的定义是move(n,a,b,c) 表示的意思是n个盘从a柱借助b柱移到c柱。 if n == 1 表示只有一个盘,此时直将这个盘从a柱移到c柱,即直接打印a--->c else 将所有的盘分成两部分,最下面一个大的和上面一个小的,只不过此时上面一个小的是由n-1个盘组成的 移两个盘怎么移? 1.先将上面的"小的",也就是n-1个盘从a柱借助c柱移到b上 即代码中的move(n-1,a,c,b) ,这个要递归 2.再将最下面的大的从a柱借助b柱移到c柱 即代码中的move(1,a,b,c) 此时就是n==1的情况 3.最后再将上面1中b上的"小的",也就是n-1个盘从b柱借助a移到c上,即代码中的move(n-1,b,a,c) 这个要递归
move(n-1, a, c, b)     #我觉得应该是直接把a移到b,不需要c
        move(1, a, b, c)   #我觉得应该是直接a移到c,不需要b
        move(n-1, b, a, c) #我觉得应该是直接b移到c,不需要b
我觉得应该是以下这样的;好象不需借要助样;我是哪里没有理解到?
move(n-1, a,  b)  
        move(1, a,  c)
        move(n-1, b,  c)

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧