递归问题中多次调用具有不同参数的函数

时间:2019-01-30 20:57:55

标签: python-3.x recursion towers-of-hanoi

我对编程还不是很陌生,因此刚刚向我介绍了递归的概念。我被介绍了著名的河内塔问题。这是我遵循的课程中的人如何解决此问题的方法:

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) ?

2 个答案:

答案 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"),因此,我将尝试说明程序的执行顺序,以使其更加清晰;

  1. n = 4 ,执行else语句,else语句中的第一行代码为Towers(4 -1,fr,spare,to),将新的函数执行添加到递归树中
  2. n = 3 ,执行else语句,else语句中的第一行代码为Towers(3 -1,fr,spare,to),将新的函数执行添加到递归树中
  3. n = 2 ,执行else语句,else语句中的第一行代码为Towers(2 -1,fr,spare,to),将新的函数执行添加到递归树中
  4. n = 1 ,如果执行语句,printmove(fr,to)有效,则递归中断。
  5. 树上所有以前的递归函数执行均按倒序终止(最后添加到递归树中->首次终止)。
  6. 现在,唯一起作用的函数执行是我们的第一个调用,{strong
  7. 程序流程继续到下一行代码Towers(4,"P1","P2","P3")
  8. 它继续以这种逻辑流动,直到最后一个递归函数调用终止。

因此,如果该代码中没有 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,然后第二个函数以此类推。