Python 递归
递归
递归是指函数调用自身。
递归是数学和编程中常见的概念。它指的是函数调用自身。这样做的好处在于,你可以循环遍历数据以获得结果。
开发者在使用递归时应格外谨慎,因为很容易写出永不终止的函数,或者占用过多内存或处理器资源的函数。然而,如果编写得当,递归可以成为一种非常高效且符合数学逻辑的编程方法。
实例
一个简单的递归函数,从 5 开始倒数:
def countdown(n):
if n <= 0:
print("Done!")
else:
print(n)
countdown(n - 1)
countdown(5)
亲自试一试 »
基本情况和递归情况
每个递归函数都必须包含两个部分:
- 基本情况 - 终止递归的条件
- 递归情况 - 函数使用修改后的参数调用自身
如果没有基本情况,函数会无限循环地调用自身,导致栈溢出错误。
实例
识别基本情况和递归情况:
def factorial(n):
# Base case
if n == 0 or n == 1:
return 1
# Recursive case
else:
return n * factorial(n - 1)
print(factorial(5))
亲自试一试 »
基本情况至关重要。务必确保你的递归函数有一个最终会被满足的条件。
斐波那契数列
斐波那契数列是一个经典的例子,其中每个数字都是前两个数字之和。该数列从 0 和 1 开始:
0, 1, 1, 2, 3, 5, 8, 13, ...
该数列无限延伸,每个数字都是前两个数字之和。
我们可以使用递归来查找数列中的特定数字:
实例
求斐波那契数列的第7项:
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(7))
亲自试一试 »
列表的递归
递归可用于一次处理一个元素来处理列表:
实例
计算列表中所有元素的总和:
def sum_list(numbers):
if len(numbers) == 0:
return 0
else:
return numbers[0] + sum_list(numbers[1:])
my_list = [1, 2, 3, 4, 5]
print(sum_list(my_list))
亲自试一试 »
实例
找出列表中的最大值:
def find_max(numbers):
if len(numbers) == 1:
return numbers[0]
else:
max_of_rest = find_max(numbers[1:])
return numbers[0] if numbers[0] > max_of_rest else max_of_rest
my_list = [3, 7, 2, 9, 1]
print(find_max(my_list))
亲自试一试 »
递归深度限制
Python 对递归深度有限制。默认限制通常在 1000 次递归调用左右。
如果需要更深的递归,可以增加递归层数限制,但请注意,这可能会导致程序崩溃。
实例
import sys
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())
增加递归限制时应谨慎。对于非常深的递归,请考虑使用迭代代替。

