无法理解递归

2024-04-29 09:37:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这里做第一个递归练习: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个值?即使是这样,这个代码机制是如何准确工作的?任何帮助都将不胜感激。非常感谢。在


Tags: 代码httpifdefelseca计数print
3条回答

每次countup()调用自身时,它最终将返回到它调用的同一点。下一行将打印n,就像在函数调用期间一样。在

每次调用一个函数时,它的所有名称都会重新创建,它们是局部。因此,每次调用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。接下来,函数返回。

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

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

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

考虑一下变体:

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

印刷品:

^{pr2}$

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, 

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

一旦满足了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

相关问题 更多 >