答案抄了一遍,完全不懂
Topic source嗯。。你的问题在于没有理解函数的参数以及递归操作。
- 我们定义函数的时候,def move(n,a,b,c) 中a,b,c所表达的意义是代指这里有三个柱子:起始柱,中间柱,终点柱。而传值的时候,给的'a','b','c',在于具体给这个函数指明了起始柱是a,中间柱是b,终点柱是c,即我们要把圆盘从a柱子移动到c柱子中间借助b柱子。
2.a,b,c上个柱子的顺序就是从左到右a,b,c。第一句的意思参考上条解释:是把n-1个柱子从a借助c移动到b。建议你可以百度下汉诺塔问题,理解汉诺塔的问题的本质。
3.循环是通过函数的递归实现的。所有的递归都是一种循环。执行顺序的话按照函数定义的顺序从上往下执行。程序中if 的话写成这样比较好理解:
def move(n,a,b,c): if n == 1: print(a,'→>',c) return else: move(n-1,a,c,b) #先执行把n-1个移动到b上这个操作。 move(1,a,b,c) #再执行把最下面1个最大的移动到 c 这个操作 move(n-1,b,a,c) #最后执行把n-1个从b上移动到c上这个操作
上面中的每个move操作都是个新函数,都会递归到函数到里面,直到执行到n=1,再return一步步跳出来。执行完第一个move,再执行第二个move,再执行第三个move. 4.你理解了3的话,4也就理解了。
希望能帮到你。
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()函数: move(3, 'a', 'b', 'c'),输出为:
a-->c, a-->b, c-->b, a-->c, b-->a, b-->c, a-->c
# 应当深刻地理解: 调用函数的栈机制的特点是先进后出.当主程序调用函数,就开始进行不断的压栈和进栈操作.函数的调用就是将函数压入栈中,函数的结束就是函数出栈的过程,这样就保证了函数调用的顺序流,即,当函数出现多层嵌套时,需要从外到内一层层将函数压入栈中,如同将书本叠放在书桌上,最后,栈顶的函数(最内层的函数)先执行结束,然后(栈顶的函数)出栈,接着倒数第二层的函数继续执行完并出栈,到最后,第一个调用(进栈)的函数才执行,执行完毕后就回到主程序,函数调用结束.但是,请注意以上'连续'调用三次move()函数的代码块,如果不考虑内层函数,语句的执行顺序依然是从上往下
# def move(n, a, b, c):
# if n == 1:
# print(a, '-->', c) #这是汉诺塔的错误玩法!
# else:
# move(n - 1, a, c, b)
# move(n - 1, b, a, c)
# move(1, a, b, c)
# 注意到最后的两行代码交换了位置
# 此时,调用move()函数:
# move(3, 'a', 'b', 'c'),输出如下:
a-->c, c-->b, a-->b, b-->a, a-->c, b-->c, a-->c
#跟之前的结果不一样,是由于调用函数的栈机制,廖老师目前没有讲到这一块,因为我们这些初学者完全不用在意这些细节,学习要循序渐进,方可登堂入室.先把基础的掌握好.共勉.
- 1
快乐的杀马特
答案抄了一遍,完全不懂
def move(n,a,b,c): #定义一个move函数,有n,a,b,c四个函数,n代表第一个架子上有几个圆盘,a,b,c是按顺序的三个架子的名字。
move(3,'a','b','c')
疑问1: 为何定义函数的时候,a,b,c是int吗,调用的时候,传的值是'a','b','c'(字符串)?
疑问2: a,b,c三个架子的顺序是如何?如第一句:move(n-1,a,c,b)意思是把n-1这些盘子从a移到c再移到b?
疑问3: 循环是哪个语句实现的?不是很明白这些语句执行的顺序。
疑问4: 只有一句print(a,'→>',c)是用来输出,用来终止递归的,为何运行结果会有那么多输出?
很多疑问,求大神来解答,如果没有的话,我学到之后的课程再返回来解答一下自己:)