我对编程还不是很陌生,因此刚刚向我介绍了递归的概念。我被介绍了著名的河内塔问题。这是我遵循的课程中的人如何解决此问题的方法:
def printmove(fr,to):
print('move from'+ str(fr)+'to'+str(to))
def Towers(n,fr,to,spare):
if n == 1:
printmove(fr,to)
else:
Towers(n-1,fr,spare,to)
Towers(1,fr,to,spare)
Towers(n-1,spare,to,fr)
Towers(4,"P1","P2","P3")
我不明白的是(而且很可能很明显,但是我只是束手无策)它如何知道何时传递给第二个递归调用Towers(1,fr,to,spare) ?
答案 0 :(得分:0)
它如何知道何时传递给第二个递归调用 Towers(1,fr,to,spare)?
实际上,这些递归函数之间的执行顺序由该控制块确定;
if n == 1:
printmove(fr,to)
如您所见,一旦 n 变量达到值 1 ,就不会再次达到 else语句,那就是为什么函数执行将结束(递归将中断)。一旦结束,程序流程将在下一行代码Towers(1,fr,to,spare)
上继续。对于您的特定示例,您已经将整数值 4 传递给了函数调用Towers(4,"P1","P2","P3")
,因此,我将尝试说明程序的执行顺序,以使其更加清晰;
Towers(4 -1,fr,spare,to)
,将新的函数执行添加到递归树中Towers(3 -1,fr,spare,to)
,将新的函数执行添加到递归树中Towers(2 -1,fr,spare,to)
,将新的函数执行添加到递归树中printmove(fr,to)
有效,则递归中断。Towers(4,"P1","P2","P3")
因此,如果该代码中没有 if-else 逻辑,则递归Towers(1,fr,to,spare)
将永远不会中断并开始无限递归。
答案 1 :(得分:-1)
在递归中,每个函数都有其自己的状态。因此,当Towers(n-1,fr,spare,to)
函数运行时,它将在每次调用中递归调用自身以将参数值减小1。此函数满足n==1
的条件后,其递归结束,然后开始对Towers(1,fr,to,spare)
的递归,并继续进行。
为了更好地理解该过程,请添加一些额外的打印语句并观察值的变化。
def printmove(fr,to):
print('move from'+ str(fr)+'to'+str(to))
def Towers(n,fr,to,spare):
print "n: " , n
if n == 1:
printmove(fr,to)
else:
Towers(n-1,fr,spare,to)
print "did A"
Towers(1,fr,to,spare)
print "did B"
Towers(n-1,spare,to,fr)
print "did C"
Towers(4,"P1","P2","P3")
我没有在这里发布答案,但是基本上第一个函数运行直到n从4变为1,然后第二个函数以此类推。