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

代码具体是如何运行的?

逻辑我懂,但我不知道为什么要这么写,定义时move不是还未定义好么?为什么直接用move定义move,还有为什么只有一个print,而且是print a箭头c,为什么会出来这么一大串?

def move(n, a, b, c):

    if n ==1:

        print a, '-->', c

        return

    move(n-1, a, c, b)

    print a, '-->', c

    move(n-1, b, a, c)

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

A --> B
A --> C
B --> C
A --> B
C --> A
C --> B
A --> B
A --> C
B --> C
B --> A
C --> A
B --> C
A --> B
A --> C
B --> C

求解释,感激不尽


正在回答

1 回答

      我来谈谈体会吧,网上看了很多,很受启发,结合自己的思考,把这个问题详尽解释一遍。现在假设我是计算机,我怎么来执行这一串代码?

  1. 当n==1时,直接将a移动到c. 记为a->c.

  2. 当n==2时,现实情况是需要b中转,移动方法为a->b,a->c,b->c.此时我(计算机)是怎么执行这串代码的呢?由于n==2,if内的语句不执行,现在执行的第一步是move(n-1, a, c, b),即为move(1, a, c, b),由于前面已经定义n==1的操作,即从第一位移动到第三位,此时运行结果为a->b,因此这里c和b必须交换位置才能得到我们想要的结果。接着执行第二步,a->c,这一步很简单,其现实意义是把a最下面一层移动到c,无论n为多大,这一步都是必不可少的,也是居中的一步。接下来第三步我们需将b移动到c,执行代码 move(1, b, a, c),执行过程与第一步类似,结果为b->c.当n==2时最终结果为a->b,a->c,b->c。

  3. 当n==3时,同样if后的语句不执行。现在执行的第一步是move(n-1, a, c, b),即为move(2, a, c, b),前面我们已经得到n==2的运行结果,但是要注意这里的参数已经变位置了,所以结果为a->c,a->b,c->b.第二步,a->c,照搬。第三步, move(2, b, a, c),同样是套用n==2时的结果,得b->a,b->c,a->c。当n==3时最终结果a->c,a->b,c->b,a->c,b->a,b->c,a->c。

  4. n==4时调用n==3的结果,这里就不再算了,但我们可以轻易的得出其运行结果必为15步。

……如此,以致无穷。

其实当n比较大时我们现实操作起来是很麻烦的,但是有了电脑,设计好模型,麻烦的计算都交给我们的好哥们去做,我们按输出的结果一步一步操作必然可以得到我们想要的效果。反思这个模型,当n较大时,反复层层调用,最终执行的却还是a->c,变量b只起中介作用,站在首位则输出,末位则入。

相信看了我的推理,你所提到的问题都找到答案了。

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

举报

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

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

进入课程

代码具体是如何运行的?

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