|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
如小甲鱼老师上课时候所讲的原理列出了递归函数表达式如下:
def hanoi_1(n,x,y,z):
if n == 1:
print(x,"-->",z)
else:
hanoi_1(n-1,x,z,y) #将n-1个盘子从x移动到y上
print(x,"-->",z) #将最底下的最后一个盘子从x移动到z上
hanoi_1(n-1,y,x,z) #将y上的n-1个盘子移动到z上
print(hanoi_1(3,'x','y','z'))
函数输出n=3时候,得以下表达式:
x --> z
x --> y
z --> y
x --> z
y --> x
y --> z
x --> z
疑问:
0 在函数里面else中,hanoi_1(n-1,x,z,y) print(x,"-->",z) hanoi_1(n-1,y,x,z)这三个式子是运行顺序是如何,是先运行print再运行第一个最后运行第三个吗?
1 在上面0表达式内,无论我怎么输出,也无法得到输出结果里面的“z --> y”这个式子啊,是我对递归函数循环的原理以及顺序理解不够吗?
2 当时小甲鱼老师在写这个式子时候,只用了三句话:#将n-1个盘子从x移动到y上 #将最底下的最后一个盘子从x移动到z上 #将y上的n-1个盘子移动到z上,这只是三个大的方向而已啊,并没有具体动作所走的顺序,然而输出的结果那么长的式子却有顺序,而且还是对的顺序,怎么也没想明白?
以上,请大牛帮忙指点,想了半天还是想不明白
本帖最后由 BngThea 于 2018-6-12 10:47 编辑
好吧,我写一个详尽的执行步骤吧
要点: 1 递归时,一旦进入递归,后续代码暂时挂起,等回归的时候继续执行
2 实参的不断变换
以 n==3 作为示例,请特别注意实参的变化
1 h(3,x,y,z)开始,判断if n==3不成立, 进入else
2 执行 h(2,x,z,y) #特别注意:此时形成和实参的对应关系是 x-x,y-z,z-y
2.1 n==2,进入else,执行h(1,x,y,z) #注意实参的匹配
print x-->z 然后返回
2.2 print x-->y
2.3 执行h(1,z,x,y)#注意实参的匹配
print z-->y 然后返回
返回到h(3,x,y,z)
3 print x-->z
4 执行 h(2,y,x,z) #特别注意:此时形成和实参的对应关系是 x-y,y-x,z-z
2.1 n==2,进入else,执行h(1,y,z,x) #注意实参的匹配
print y-->x 然后返回
2.2 print y-->z
2.3 执行h(1,x,y,z)#注意实参的匹配
print x-->z 然后返回
返回到h(3,x,y,z)
程序结束
从上面看来,打印结果就是紫色字体的顺序排列
|
|