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

请大神讲解一下这个题。

任务

汉诺塔 (http://baike.baidu.com/view/191666.htm) 的移动也可以看做是递归函数。

我们对柱子编号为a, b, c,将所有圆盘从a移到c可以描述为:

如果a只有一个圆盘,可以直接移动到c;

如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。

请编写一个函数,给定输入 n, a, b, c,打印出移动的步骤:

move(n, a, b, c)

例如,输入 move(2, 'A', 'B', 'C'),打印出:

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

无法理解这个题目的意思。

正在回答

6 回答

你可以理解成这样:move(移动个数,起点,转折点,终点)

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

百度了一下原理,大概弄明白了。加入a上面有两个圆盘,要把a上面的圆盘移到c上,顺序会是a—b;a—c,b—c。如果把圆盘数抽象为n的话,我们可以把n看成1和n-1的组成。把n-1看作一个单位的话,这样,就可以把这个过程抽象为2个圆盘。那么,移动的顺序也会是a—b;a—c,b—c。move(n-1,a,c,b)表示的是,将n-1个圆盘移动到b上面去,a表示的是起始点,b表示的是终点,c是转折点;move(1,a,b,c)表示把最后一个圆盘由a移入c中,同理,a是起始点,c是终点,b是转折点;最后move(n-1,b,a,c),即把事先移动好的圆盘从b放入c中,此时b是起点,c是终点,a是转折点。望采纳~~

附:http://blog.csdn.net/qugename/article/details/41088367  (当初就是看这个博客的解释看明白的)

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

        if n==1:

            print a,"-->",c    else:


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

也是没看懂,应该是把一张a搬到b,然后a在搬一张放到c,然后再把b的一张搬到c。

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

a,b,c是定义到参数,被称作形参,不具有任何意义,只是一个符号,不分配内存空间,只是告诉编译器,move函数这里需要4个参数,名字为n,a,b,c.

当你调用move函数的时候,move(4,‘A’,‘B’,‘C’),这里传入到4个参数被称作实参,是实际存在的。

当程序执行这一步之后,去转到 def move(n,a,b,c),开始执行子程序。

然后用实参代替形参。简单的说,就是给形参创建空间,并且赋值为实参。

即:创建名字为n的变量,n=4,创建名字为a的变量,a=‘A’,创建。。。。

上面说的是子程序的调用和执行,你说无法理解这个题目,我这么跟你说吧,这是一个经典的递归程序,不论你学习哪种编程语言还是纯粹的算法,讲到递归必然是要讲汉诺塔问题的。

我觉的题目已经解释的非常清楚了,就是在重复的做一系列的过程:

如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。

我贴一段代码你理解一下吧,如果理解不了就google,这是最经典的递归思想,当然也是比较简单的。不要认为它有难度。


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

        if n==1:

            print 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')


这里格式有点小问题,是粘贴导致的。。。。

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

Looks3708772 提问者

move(n-1,a,c,b) move(1,a,b,c) move(n-1,b,a,c) 这三部是这个意思么?首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。我不明白为什么字母顺序一定要这样写,(a,c,b)(a,b,c)(b,a,c)。。。
2016-07-25 回复 有任何疑惑可以回复我~
#2

Looks3708772 提问者

move(n-1,a,c,b) move(1,a,b,c) move(n-1,b,a,c) 这三部是这个意思么?首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。我不明白为什么字母顺序一定要这样写,(a,c,b)(a,b,c)(b,a,c)。。
2016-07-25 回复 有任何疑惑可以回复我~
#3

求球 回复 Looks3708772 提问者

回复不能超过300字,白打了好多字。。
2016-07-26 回复 有任何疑惑可以回复我~
#4

求球 回复 Looks3708772 提问者

你如果是在是不明白,可以给我发邮件 nianhaoouc@gmail.com
2016-07-26 回复 有任何疑惑可以回复我~
#5

求球 回复 Looks3708772 提问者

回复还得打验证码,不爽。http://blog.csdn.net/geekwangminli/article/details/7981570 这篇博客讲的还行吧,你看看先,虽然废话有点多。。。
2016-07-26 回复 有任何疑惑可以回复我~
查看2条回复

n代表圆盘数,ABC代表柱子, move(2, 'A', 'B', 'C')表示,有2个圆盘,A上面的圆盘是按从小到大的的顺序放置的,同样按照从小到大的顺序把A柱子上的圆盘移动到C柱子上面

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

Looks3708772 提问者

那b是什么鬼
2016-07-25 回复 有任何疑惑可以回复我~
#2

Looks3708772 提问者 回复 缪王大可

move(n-1,a,c,b) move(1,a,b,c) move(n-1,b,a,c) 这三部是这个意思么?首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。我不明白为什么字母顺序一定要这样写,(a,c,b)(a,b,c)(b,a,c)。。。
2016-07-25 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

请大神讲解一下这个题。

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