Skip to content

Python 递归

当一个函数调用自身时,它被称为递归函数。在本教程中,我们将学习如何编写Python递归函数。

Python中的递归是什么?

当一个函数以调用自身的方式定义时,它被称为递归函数。这种现象称为递归。Python 支持递归函数。

我们真的需要递归函数吗?

递归与循环非常相似,每次迭代都会调用函数。因此,我们可以始终使用循环来代替 Python 递归函数。

但是,有些程序员更喜欢使用递归而不是循环。这主要是一个选择问题,你可以自由选择使用循环或递归。

Python递归函数示例

让我们来看几个 Python 中递归函数的例子。

1. 整数的阶乘

整数的阶乘是通过将从 1 到该数的所有整数相乘来计算的。例如,10 的阶乘是 123…*10。

让我们看看如何使用 for 循环编写阶乘函数。

python
def factorial(n):
    result = 1
 
    for i in range(1, n + 1):
        result = result * i
 
    return result
 
print(f'Factorial of 10 = {factorial(10)}')
print(f'Factorial of 5 = {factorial(5)}')

让我们看看如何修改 factorial() 函数以使用递归。

python
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)
 
print(f'Factorial of 10 = {factorial(10)}')
print(f'Factorial of 5 = {factorial(5)}')

下图显示了递归函数的执行过程。

Python递归函数示例

2. 斐波那契数列

斐波那契数列是一个数列,其中每个数字都是前两个数字之和。例如:1、1、2、3、5、8、13、21,以此类推。

让我们来看一个使用循环返回斐波那契数列的函数。

python
def fibonacci(n):
    """ Returns Fibonacci Number at nth position using loop"""
    if n == 0:
        return 0
    if n == 1:
        return 1
    i1 = 0
    i2 = 1
    num = 1
    for x in range(1, n):
        num = i1 + i2
        i1 = i2
        i2 = num
    return num
 
for i in range(10):
    print(fibonacci(i), end=" ")
 
# Output: 0 1 1 2 3 5 8 13 21 34

以下是使用递归实现的 fibonacci() 函数。

python
def fibonacci(n):
    """ Returns Fibonacci Number at nth position using recursion"""
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)
 
for i in range(10):
    print(fibonacci(i), end=" ")
 
# Output: 0 1 1 2 3 5 8 13 21 34

使用递归实现 Python 斐波那契数列

这里递归函数的代码更简洁易懂。因此,在这种情况下使用递归是合理的。

递归中的基本情况是什么?

定义递归函数时,必须至少存在一个已知结果的基本情况。之后,每次递归调用都必须使结果更接近基本情况。这是为了确保递归调用最终能够终止。否则,函数将永远无法终止,并导致内存溢出错误。

您可以在以上两个示例中验证这种行为。递归函数调用的参数越来越接近基本情况。

递归的优点

  • 有时递归可以减少代码行数。
  • 递归代码看起来很简单。
  • 如果我们知道基本情况,那么在函数中使用递归就更容易了。

递归的缺点

  • 如果实现不当,该函数将永远不会终止。
  • 与循环相比,理解递归更容易让人困惑。

递归还是循环?

这完全是个人选择。我总是更喜欢用循环而不是递归。我还没见过任何不能用循环而只能用递归的例子。

参考: