Python 递归函数 - 这里发生了什么?

标签 python function recursion factorial

我有一个用 python 编写的简单阶乘函数,其中嵌入了一堆调试,以帮助我理解正在发生的事情。然而,输出让我更加困惑。谁能帮我理解? (顺便说一句,如果出现打印输出计时问题,我运行了几次但得到了完全相同的输出。)

recursive_function.py

def recursive(n):
  if n == 1:
    return 1
  print ('n : {}'.format(n))
  print ('recursive return value is: {}'.format(n*recursive(n-1)))
  return n*recursive(n-1)

x = recursive(5)
print('***** End result is: {}'.format(x))

(带行号)
1   n : 5
2   n : 4
3   n : 3
4   n : 2
5   recursive return value is: 2
6   recursive return value is: 6
7   n : 2
8   recursive return value is: 2
9   recursive return value is: 24
10  n : 3
11  n : 2
12  recursive return value is: 2
13  recursive return value is: 6
14  n : 2
15  recursive return value is: 2
16  recursive return value is: 120
17  n : 4
18  n : 3
19  n : 2
20  recursive return value is: 2
21  recursive return value is: 6
22  n : 2
23  recursive return value is: 2
24  recursive return value is: 24
25  n : 3
26  n : 2
27  recursive return value is: 2
28  recursive return value is: 6
29  n : 2
30  recursive return value is: 2
31  ***** End result is: 120

(没有行号的更干净的输出)
n : 5
n : 4
n : 3
n : 2
recursive return value is: 2
recursive return value is: 6
n : 2
recursive return value is: 2
recursive return value is: 24
n : 3
n : 2
recursive return value is: 2
recursive return value is: 6
n : 2
recursive return value is: 2
recursive return value is: 120
n : 4
n : 3
n : 2
recursive return value is: 2
recursive return value is: 6
n : 2
recursive return value is: 2
recursive return value is: 24
n : 3
n : 2
recursive return value is: 2
recursive return value is: 6
n : 2
recursive return value is: 2
***** End result is: 120

最佳答案

该函数接受一个数字并计算 factorial结果。

因此,对于 5 的值结果是 5 * 4 * 3 * 2这是 120 .

使该函数成为递归函数是有意义的,因为 5 的阶乘是 4 的阶乘的 5 倍,4 的阶乘是 3 的阶乘的 4 倍,依此类推。如果函数被 n = 1 调用,阶乘简单地返回为 1并且递归可以停止。

将其视为此处运行的实际算法:

  • 5 的阶乘 = 5 * 4 的阶乘
  • 4 的阶乘 = 4 * 3 的阶乘
  • 3 的阶乘 = 3 * 2 的阶乘
  • 2 的阶乘 = 2 * 1 的阶乘
  • 1 = 1 的阶乘
  • 关于Python 递归函数 - 这里发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58900399/

    相关文章:

    java - 评估树遍历递归算法中是否可能出现堆栈溢出错误(Java)

    python - 按照 init 中显示的顺序表示一个类,无需硬编码

    python - pandas DataFrame to_html 中的粗体列

    javascript - JS 如何处理它的代码?

    php-如何绕过函数中的某些参数

    Java:用递归画圆

    python - 链接到 Flask 模板中的特定位置

    python - 类 python 的实例的 getattr 查找失败

    mysql - SQL-根据另一列的内容查找最大值

    math - 设置和解决递归函数的递归关系?