找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3116|回复: 3

[求助] 求助 汉诺塔递归的函数的参数传递是怎么理解的

3

主题

4

帖子

4

积分

贫民

积分
4
朱雀公子 发表于 2017-8-17 06:05:12 | 显示全部楼层 |阅读模式
def move(n,a,b,c):
    if n==1:
        print(a,'-->',c)   #如果只有一个,可以直接移动了
    else:

        move(n-1,a,c,b)   #先想方设法把最上面的n-1个盘子从a移动到b上 a='a',c='b',b='c'
        move(1,a,b,c)     #可以移动最底下的盘子了
        move(n-1,b,a,c)   #再想方设法把B上的盘子移到C上
move(3,'a','b','c')
这是我在网上搜的一个程序,实在理解不了。

move(n,a,b,c)  到 move(n-1,a,c,b)  它的参数是如何传递的。
我不明白为什么  move(n-1,a,c,b)   一开始 N =2 的时候参数会变成(2,'a','c','b')当N=1的时候,参数又变成了 (1,'a','b','c')感觉一会按照顺序传递参数,一会又是按照形参一对一的传递参数。


回复

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
秋楪祈 发表于 2017-8-18 09:56:38 | 显示全部楼层
           主要是递归的思想,第一步先判断是否只有一个盘子,如果是,就直接输出移动路径,如果不是就进入到else里,这里分三步:1.你要想把最后一个盘子从a--->c,就得借助b,什么情况下能直接把最后一个盘子从a-->c,那就是只有一个盘子的时候,所以上面n-1个盘子都得移动到b上面去,根据汉诺塔的规则,大盘不能在小盘上,所以就得借助c盘,就是 move(n-1,a,c,b) 。2.第二步就简单了,把最后一个盘子从a-->c,你可以直接print(a,'--->'c),也可以用递归,move(1,a,b,c) 。3.第三步,把b上面的n-1个盘子,借助a移动到c上,和第一步差不多递归调用move(n-1,b,a,c)。你可以画个草图看一下移动过程,或者在网上找个汉诺塔游戏自己玩一下就懂了
回复 支持 1 反对 0

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-8-17 12:00:37 | 显示全部楼层
不要把调用时传入的abc跟函数中定义的参数名字对应起来,只要对应位置就好了,特别是在递归操作中,很容易搞混的
比如move(n-1,a,c,b) 这一步调用,与def move(n,a,b,c)函数定义参数的对应关系是:n-1 -> n, a -> a, c -> b, b -> c
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2017-8-18 16:44:25 | 显示全部楼层
秋楪祈 发表于 2017-8-18 09:56
主要是递归的思想,第一步先判断是否只有一个盘子,如果是,就直接输出移动路径,如果不是就进 ...

回复 支持 反对

使用道具 举报

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

本版积分规则

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