Discuss / Python / 对之前问题以及递归过程的详细解释。

对之前问题以及递归过程的详细解释。

Topic source

郝仁E哥

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

@我叫刘璇尊 @嚜鹿
else: move(n-1, a, c, b) # 子目标1 move(1, a, b, c) # 子目标2 move(n-1, b, a, c) # 子目标3

 先说明一下递归调用的函数参数的一些问题,否则容易混乱,我调用时使用move(3,'A','B','C'),而我的代码函数原型为move(n,a,b,c),此处的后3个形式参数为a,b,c,故容易混乱,因为在递归调用时,a,b,c的值根据传入的参数顺序而定,并不是对应'A','B','C'不变的,a,b,c只是形参的名字而已,可以把原型改为move(n,g1,g2,g3)也是可以的,这里需弄明白,在下面我会讲思路时举例解释清楚:

此处的执行是这样的:

     我的例子是3个盘子,当n=3时,执行子目标1:move(2,a,c,b),这里实际上是move(n=2,a='A',b='C',c='B')根据顺序一一对应,此时会进入子目标1的递归执行中去,在子目标1的递归执行中,你可以看到此时n=2,不等于1,所以进入else,再次进入新的子目标1:move(2-1,a,c,b)即move(1,a,c,b)=move(n=1,a=上级的a='A',b=上级的c='B',c=上级的b='C')的递归调用中,此时n终于等于1了,执行print(a,'->',c)所以第一次到达n=1时调用的是move(1,a='A',b='B','C'),,所以输出 A->C,这里刚好a='A',b='B',c='C',其他情况下也许是不对应的,输出完就返回上一级的调用函数move(2,'A','C','B')中,刚执行完它的子目标1,,继续执行它的子目标2:move(1,a,b,c)=move(1,'A','C','B'),输出了A->B,在执行它的子目标3:move(2-1,b,a,c)=move(1,a=上一级的b='C',b=上一级的a='A',c=上一级的c='B'),所以输出C->B,返回上一级调用函数,至此,move(n=2,a='A',b='C',c='B')执行完毕,即move(3,'A','B','C')的子目标1执行完毕,返回上一级调用函数,继续它的其他子目标,原理差不多,不再赘述了,其实递归调用就是压栈出栈。

希望能帮助大家明白,这个用文字描述起来也是挺难的,码字好累,尽力了,画图会很好理解,可以拿纸和笔推算一下整个过程。


  • 1

Reply