为了账号安全,请及时绑定邮箱和手机立即绑定

关于题目中的阐释

①中间这段话本身我不能理解,当n>=3时,明显需要借助a进行多次操作(如)才能完成,为什么用(N-1)就能使操作变成简单的A到B,A到C,然后B到C就结束了?(当N=3时,实际操作需要7步,但编程只用了这3步表达)这样看起来似乎只需要3个步骤啊?这个该怎么理解呢?我始终理解不了,是对递归函数的定义不清晰吗?

②:抛开第一个问题,我翻了答案,def move(n,a,b,c),if n==0,输出a到c然后return,这个我理解,接下来就是move(n-1,a,c,b),这一句里面b,c换位置是为何?我也百度许多,就是看不懂啊,因为没人具体解释这里,不太能理解,然后这一句后面是一句输出接着又是一句move(n-1,b,a,c)又是换位置的,我看不太懂


正在回答

6 回答

这个问题其实很简单,就假设只有2块,要从第一个柱子移动到第三个柱子,但移动时均要借助第二个柱子转移一下。这样就是说,不管从哪个柱子到目标柱子,都要借助另外那个柱子中转一下。

假设两块叫(x,y),柱子叫(①②③),移动x 柱子顺序是①②③,移动y时柱子顺序先是①③②,最后移动y的顺序是②①③,只不过这里y用n-1代替了而已,递归一下就ok了,语句不代表就需要三步,而是重复同样的步骤而已

0 回复 有任何疑惑可以回复我~
#1

qq_玩岚子_0 提问者

不胜感激!我就是搞不懂盘子的移动和move中元素的改变有什么联系,为什么这样改变,现在大概懂了,如果你还有时间,请你看这个问题下面我的回答,看看我的理解正不正确,谢谢!
2017-02-15 回复 有任何疑惑可以回复我~
#2

qq_玩岚子_0 提问者

非常感谢!
2017-02-16 回复 有任何疑惑可以回复我~
#汉诺塔
def move(n, a, b, c):
   if n ==1:
       print(a, 'to', c)
       return
   move(n-1, a, c, b)#move(1,a,c,b)然后先运算这个move,此时n=2-1=1,即,move(1,'A','C','B'),则print(a,'to',c),此时这个move已经运算结束了,可以开始下一行的运算
   print(a, '-->', c)#上面一行等于语句print(a,'to',c),所以这一行照常print
   move(n-1, b, a, c)#此时,依然是n=2-1=1,则运算这个move,即,move(1,'B','A','C'),同上,当n=1时,print(a,'to',c)
move(2, 'A', 'B', 'C')
0 回复 有任何疑惑可以回复我~
#1

qq_玩岚子_0 提问者

非常感谢你,我就是不太懂这个代码的执行顺序,但是还有一个小问题,print(a,'-->',c)#上一句等同print(a ,'to',c),所以这一行照常print, 上一行就是move(n-1,a,c,b)这一句,这个时候tuple[1,3]分别为'A','B'了,接下来的print(a,'-->',c)不应该输出A-->B吗?难道说这一句print因为没有在上一句move的缩进之下(或者说同级,不知道我这个理解对不对),所以这一句print针对的是move(n,a,b,c)?
2017-02-20 回复 有任何疑惑可以回复我~
#2

Mr扶风人3851981 回复 qq_玩岚子_0 提问者

我自己感觉,你可以把 print(a, '--> ',c)看成 move(1,a,b,c),上面已经将n-1个盘子移到B上,下面就把A上剩的最后一个盘子移到C上,我自己是这么理解的,不知道对不对。
2017-02-21 回复 有任何疑惑可以回复我~
#3

他is 回复 qq_玩岚子_0 提问者

只需要把上一行的move(n-1,a,c,b)看做是一个print()语句就可以了。这个move()本身就是一个运算循环,自己运算结束,不影响下一行的print,因为这个print是针对def move()这个函数的。
2017-02-21 回复 有任何疑惑可以回复我~

接之前那个'to'和'-->'的问题,

我尝试理解当n=2时,

代码跳过if执行move(n-1,a,c,b)的时候,这个时候其实就是move(1,a,c,b)了,有笔记说这个就已经满足if条件,因此执行if,输出if里的a to c,但是答案是a to b,也就是说,这个时候,tuple[3]已经是b了,但接下来的一句print a-->c应该就代表答案里的第二句a-->c吧?怎么答案里的c又变回c了?我感觉在进行print a-->c的时候,之前一句的move(n-1,a,c,b)……写到这里时我就不知道自己在说什么想什么了,好糊涂,

               换个说法吧,move(n-1,a,c,b)这一句代码执行之后的结果,对应实际情况就是a(第n个),b(n-1个),c(0个)

然后其下的print a-->c,这一句代码执行之后,实际情况似乎变成了a(0个),b(n-1个),c(第n个)

那么,这一句print输出语句是怎么完成一次改变实际情况的?他只是一个输出语句,什么命令都没有执行吧?还是说我理解错误了?

我在上面的有个回答里发现,这一步print所应该造成的表现,其实际操作过程似乎被归纳到第三句move(n-1,b,a,c)中了,根据我现在迷糊的情况,我认为这个看法可能是错误的……

我的问题就在第二句print a-->c,代码是如何实现根据这一步得到答案a-->c的,毕竟在前一句已经改变了tuple[3]为b了

哎,好混乱

1 回复 有任何疑惑可以回复我~

请原谅我又有问题,麻烦大家帮我看一下,解决一下
我稍微改了下标准答案(就是将其中一个print的'-->'换成了‘to’)
def move(n,a,b,c):
    if n==1:
        print a,'to',c
        return
    move(n-1,a,c,b)
    print a,'-->',c
    move(n-1,b,a,c)
这样做的原因,当n=2时,得到答案:
a to b
a --> c
b to c

可以看出来,答案第一句a to b 是代码执行if里面的print a to c而非move(n-1,a,c,b)下面的print a-->c。

那么问题是,当n=2时,if条件不满足,就会跳过if执行move(n-1,a,c,b),这一步就是思路的第一步:把n-1个盘从a移到c,接着print a-->c,那么为什么答案的第一句是a to c呢?

这个执行顺序到底是怎么回事?还是我对代码的理解有误?

2 回复 有任何疑惑可以回复我~

恩!经过反复思考,我发现后面的move(n-1,b,a,c)其实代表的是两步,第一步就是前一句printa到c(这一步在代码中只是输出,并没有进行操作,应该是并入后面这个move里了),就是执行这一步里的把第n个盘子,从a移到c,然后第二步,把(【上上句move(n-1,a,c,b)里从a移到b的】(n-1)个盘子再从b移到c,这一句其实代表了两个步骤,因此我看不懂,

不过现在还是有些不懂:

n-1个盘子从a到b,原句从move(n,a,b,c)到move(n-1,a,c,b),n变成n-1,说明只移动n-1个,那么b和c的位置互换了,是怎么回事呢?不是把n-1个盘从a到b吗?跟c应该没关系啊?

0 回复 有任何疑惑可以回复我~
#1

qq_玩岚子_0 提问者

哎!看了笔记列表中“忧郁的兔八哥”同学的笔记,我瞬间恍然大悟! 原来move(n,a,b,c)这句的意思就是把n个东西,从a借助b,移动到c上去 所以第一句中move(n-1,a,c,b)的意思就是把n-1个东西,从a借助c,移动到b上去 然后第二步该是把a中的第n个,也就是剩下的那个,直接从a到c去,这一步该是move(1,a,(?),c),答案中用了if语句直接定义这个move(……)就等于printa到c,
2017-02-15 回复 有任何疑惑可以回复我~
#2

qq_玩岚子_0 提问者 回复 qq_玩岚子_0 提问者

然后第三步把b中的n-1个借助a移到c,所以是move(n-1,b,a,c) 感觉自己像是完全理解了,怎么说呢,我原来根本不知道move(n,a,b,c)已经定义好了一个映射方式(把n个从a借b移到c)…… 一路从第一章到这里,总觉得少学了点什么……
2017-02-15 回复 有任何疑惑可以回复我~
你别把问题想的那么复杂,你假设n=2 用代码过一遍,再把2替换成n-1,道理都一样的,至于n是100,1000还是更多,
让代码自己去跑就OK了


0 回复 有任何疑惑可以回复我~
#1

qq_玩岚子_0 提问者

感谢!把n=2带进去看,我觉得自己理解了,但是又像是没有理解,有点不太懂。现在大概理解了一下,如果你还有时间,请你看这个问题下面我的回答,看看我的理解正不正确,谢谢!
2017-02-15 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
初识Python
  • 参与学习       758624    人
  • 解答问题       8667    个

学python入门视频教程,让你快速入门并能编写简单的Python程序

进入课程

关于题目中的阐释

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信