Discuss / Python / 答案抄了一遍,完全不懂

答案抄了一遍,完全不懂

Topic source

答案抄了一遍,完全不懂

def move(n,a,b,c): #定义一个move函数,有n,a,b,c四个函数,n代表第一个架子上有几个圆盘,a,b,c是按顺序的三个架子的名字。

if n ==1: 
    print(a,'→>',c)
    return   #当圆盘个数为1时,把圆盘从a移到c即可完成。是用来终止递归的。

move(n-1,a,c,b)  # 把除了a架子最下的一个圆盘外的圆盘,移动到b盘
move(1,a,b,c) #把a架子最下一个圆盘,移动到c盘
move(n-1,b,a,c) #把b架子最下一个圆盘外的圆盘移动到c。

#循环,直到a上所有移动到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)是用来输出,用来终止递归的,为何运行结果会有那么多输出?

很多疑问,求大神来解答,如果没有的话,我学到之后的课程再返回来解答一下自己:)

雅尓达x_x

#2 Created at ... [Delete] [Delete and Lock User]

嗯。。你的问题在于没有理解函数的参数以及递归操作。

  1. 我们定义函数的时候,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

Reply