无法理解递归

时间:2014-09-01 19:09:09

标签: python python-3.x recursion

我正在这里进行第一次递归练习:http://cscircles.cemc.uwaterloo.ca/16-recursion/

我按照明显的提示做了这个:

def countup(n):
  if n == 0:
    print('Blastoff!')
  else:
    countup(n - 1)
    print(n)

因此代码基本上从0(爆破)到n计数。我只是不明白它是如何工作的 - 我看着可视化器,它通过countup(n)到countup(0),此时它打印掉了'Blastoff',全部好。在此之后它会停留在else循环中并开始打印出之前的n个值。为什么它会这样做。它是否出于某种原因存储了n个值,即使它确实如何使这个代码机制正常工作?任何帮助将不胜感激。非常感谢。

3 个答案:

答案 0 :(得分:5)

每次countup()自我调用时,它最终会返回到它调用的同一点。然后,下一行将打印n,因为在该函数调用期间它是

每次调用函数时,所有名称都会重新创建,它们是 local 。因此,每次致电countup()时,您都会拥有n的本地独立价值。

基本上,您创建了一系列countup()来电:

  • countup(2)n2,而非0,因此执行else分支,调用countup(1)

    • countup(1)n1,而非0,因此执行else分支,调用countup(0)

      • countup(0)n0,打印Blastoff!!,函数返回


      返回countup(0)次调用,下一行打印n,此调用仍为1。接下来,函数返回。

    返回countup(1)次来电,下一行打印n,此次通话仍为2。接下来,函数返回。

答案 1 :(得分:4)

它使用递归来打印数字 理解这一点的最好方法是举个例子:

countup(3)
  countup(2)
    countup(1)
      countup(0)
        n == 0
        print('Blastoff!')
    print (1)
  print(2)
print(3)

每次调用该函数时,它都会使用n-1调用相同的函数,直到n==0。此时,它开始打印数字,如图所示。

答案 2 :(得分:1)

考虑变体:

def countup(n):
  if n == 0:
    print('Blastoff!')
  else:
    print(n, end=', ')
    countup(n - 1)
       # print(n, end=', ')    reverse  

打印:

5, 4, 3, 2, 1, Blastoff!

Vs使用递归调用反转打印的顺序:

def countup(n):
  if n == 0:
    print('Blastoff!')
  else:
        # print(n, end=', ')    reverse  
    countup(n - 1)
    print(n, end=', ')

打印:

Blastoff!
1, 2, 3, 4, 5, 

您现在可以看到countup(n - 1)之前print(n, end=', ')的递归调用,在遇到任何打印之前,该函数必须一直到if n == 0:的结束测试。< / p>

一旦满足if n == 0:的条件,则解开整个调用链,以相反的顺序将参数打印到countup

考虑另一个反转字符串的经典递归示例:

def rrev(s):
    if s == "":
        return s
    else:
        return rrev(s[1:]) + s[0] 

或者,更简洁:

def rrev(s):
    return rrev(s[1:]) + s[0] if s else s