【问题标题】:How does this recursive function in Python work?Python中的这个递归函数是如何工作的?
【发布时间】:2015-10-13 13:57:48
【问题描述】:

我正在从《ThinkPython》这本书中学习 python。

在第 56 页(第 6 章。富有成效的函数)中,有一个递归函数可以计算任意数的阶乘。它确实有效,但我不明白为什么。这是代码:

def factorial(n):
    if n == 0:
        return 1
    else:
        recurse = factorial(n-1)
        result = n * recurse
        return result

假设我尝试使用 3,我想这应该会发生:

  1. 进入阶乘函数,n=3
  2. 进入else语句,因为n不为0
  3. 这里回到第 1 步的开头,n = 2

所以它应该在n = 0 之前执行相同的操作并返回1(它永远不会到达最后一行)。

【问题讨论】:

  • “回到开头”可能是你误解的根源。一个函数的多个实例可以同时存在于调用堆栈中,并且每个实例都会记住它的位置。当第二个阶乘调用完成时,它返回到第一个阶乘调用,它仍在else 块中。它不像whilefor 循环,它返回到顶行。
  • 函数遵循阶乘(n)的定义:the number n multiplied by the factorial(n-1)。测试在那里将其停止在零(递归的基础)。有很多关于recursion 的阅读资料
  • 是的,我相信 OP 不清楚的是 recurse = factorial(n-1) 不仅仅是函数的 go back to the beginning,而是再次调用函数
  • IME,人们仅仅通过阅读解释是无法理解递归的。您必须假装自己是口译员,然后自己完成这些步骤,看看发生了什么。 FWIW,当我学习这些东西时,我发现在大纸上制作图表很有帮助。

标签: python python-2.7 recursion recursive-datastructures


【解决方案1】:

你的功能是:

def factorial(n):
 if n == 0:
  return 1
 else:
  recurse = factorial(n-1)
  result = n * recurse
  return result

让我们一步一步地执行这个函数,从 n = 3 开始。

Entering 
STATE 1 
n = 3 
recurse = factorial(3-1)

STATE 2
n = 2
recurse = factorial(2-1)

STATE 3
n = 1
recurse = factorial(1-1)

STATE 4
You now have an n = 0, so you return 1 to STATE 3.

STATE 3
n = 1
recurse = 1
result = 1
return result to STATE 2

STATE 2
n = 2
recurse = 1
result = 2 * 1 = 2
return result to STATE 1

STATE 1
n = 3
recurse = 2
result = 3 * 2 = 6

然后 6,即 3 的阶乘,返回给调用函数 :D

递归确实是一件棘手的事情,只是需要时间来适应它以及它可以使用的不同方式。

【讨论】:

  • 说得好,瓦莱丽。我非常喜欢手动完成这样的步骤以了解算法的工作原理。
【解决方案2】:

就你而言,你是对的。但是,您还不够远。当 factorial(0) 调用返回时,它返回到哪里?它返回到

recurse = factorial (n - 1)

n = 1 所在的行,然后从那里继续。 所以,recurse = 1result = 1* 1 = 1,并返回 1。同样,这会转到 n=2 案例中的递归 = 行。所以,result = 2*1 = 2,并将其返回到 n = 3 的递归 = 行,所以result = 2 * 3 = 6,这就是返回的内容。

【讨论】:

    【解决方案3】:

    n 的阶乘定义为n * (n-1) * (n-2) 等直到1

    所以对于n = 5 -> 5*4*3*2*1

    在代码中,阶乘定义为n * whatever the factorial of n-1 is

    Python 会通过问自己找出最后一部分:n-1 的阶乘是什么?嗯,是(n-1) * whatever the factorial of (n-1)-1

    你看到循环/递归了吗?

    由于n==0 的阶乘将返回1,python 可以一遍又一遍地问自己递归部分是什么,直到它问自己what is the factorial of 0?。这部分在第一部分是硬编码的。

    一旦它进入最后一部分,它也知道其他答案! 对于n == 5

    • 阶乘是 5 *(4 的阶乘)
      • 阶乘是 4 *(3 的阶乘)
        • ...
          • 0 的阶乘是 1。

    5 的阶乘 = 5*4*3*2*1

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2021-11-14
      • 2020-08-18
      相关资源
      最近更新 更多