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)}')下图显示了递归函数的执行过程。

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
这里递归函数的代码更简洁易懂。因此,在这种情况下使用递归是合理的。
递归中的基本情况是什么?
定义递归函数时,必须至少存在一个已知结果的基本情况。之后,每次递归调用都必须使结果更接近基本情况。这是为了确保递归调用最终能够终止。否则,函数将永远无法终止,并导致内存溢出错误。
您可以在以上两个示例中验证这种行为。递归函数调用的参数越来越接近基本情况。
递归的优点
- 有时递归可以减少代码行数。
- 递归代码看起来很简单。
- 如果我们知道基本情况,那么在函数中使用递归就更容易了。
递归的缺点
- 如果实现不当,该函数将永远不会终止。
- 与循环相比,理解递归更容易让人困惑。
递归还是循环?
这完全是个人选择。我总是更喜欢用循环而不是递归。我还没见过任何不能用循环而只能用递归的例子。