递归是一种在函数体内调用自身的编程技巧。通过递归,一个问题可以被分解成更小的子问题,直到达到某个终止条件,然后逐层返回结果,最终解决原始问题。
递归函数通常包含两个部分:递归调用和终止条件。递归调用是指函数在其自身内部调用自身。终止条件是指确定递归何时结束的条件,避免进入无限循环。
递归函数的实现方式通常遵循以下步骤:
下面是一个可视化的递归过程的例子,以计算阶乘(factorial)为例:
factorial(n):
if n == 0: // 终止条件
return 1
else:
return n * factorial(n - 1) // 递归调用
递归的调用栈示意图:
factorial(5)
-> 5 * factorial(4)
-> 4 * factorial(3)
-> 3 * factorial(2)
-> 2 * factorial(1)
-> 1 * factorial(0)
-> return 1
-> return 1 * 1 = 1
-> return 2 * 1 = 2
-> return 3 * 2 = 6
-> return 4 * 6 = 24
-> return 5 * 24 = 120
递归函数的调用过程是层层嵌套的,每个递归调用都会创建一个新的函数执行上下文(函数的局部变量等),直到达到终止条件后开始逐层返回结果。
以下是一个使用递归计算斐波那契数列的例子:
def fibonacci(n):
if n <= 1: # 终止条件
return n
else:
return fibonacci(n-1) + fibonacci(n-2) # 递归调用
# 调用示例
print(fibonacci(5)) # 输出: 5
题目:
def factorial(n):
if n == 0: # 终止条件
return 1
else:
return n * factorial(n - 1) # 递归调用
# 调用示例
print(factorial(5)) # 输出: 120
递归调用栈示意图:
factorial(5)
-> 5 * factorial(4)
-> 4 * factorial(3)
-> 3 * factorial(2)
-> 2 * factorial(1)
-> 1 * factorial(0)
-> return 1
-> return 1 * 1 = 1
-> return 2 * 1 = 2
-> return 3 * 2 = 6
-> return 4 * 6 = 24
-> return 5 * 24 = 120
def fibonacci(n):
if n <= 1: # 终止条件
return n
else:
return fibonacci(n-1) + fibonacci(n-2) # 递归调用
# 调用示例
print(fibonacci(6)) # 输出: 8
递归调用栈示意图:
fibonacci(6)
-> fibonacci(5) + fibonacci(4)
-> fibonacci(4) + fibonacci(3) + fibonacci(3) + fibonacci(2)
-> fibonacci(3) + fibonacci(2) + fibonacci(2) + fibonacci(1) + fibonacci(2) + fibonacci(1) + fibonacci(1) + fibonacci(0)
-> fibonacci(2) + fibonacci(1) + fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(0) + fibonacci(1)
-> fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(0) + fibonacci(1) + fibonacci(0) + fibonacci(1)
-> return 1
-> return 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 = 5
-> return 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 = 8
-> return 2 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 1 + 0 = 13
-> return 3 + 2 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 1 + 0 = 21
-> return 5 + 8 = 13
def reverse_list(lst):
if len(lst) == 0: # 终止条件
return []
else:
return [lst[-1]] + reverse_list(lst[:-1]) # 递归调用
# 调用示例
print(reverse_list([1, 2, 3, 4, 5])) # 输出: [5, 4, 3, 2, 1]
递归调用栈示意图:
reverse_list([1, 2, 3, 4, 5])
-> [5] + reverse_list([1, 2, 3, 4])
-> [4] + reverse_list([1, 2, 3])
-> [3] + reverse_list([1, 2])
-> [2] + reverse_list([1])
-> [1] + reverse_list([])
-> return []
-> return [1] + [] = [1]
-> return [2] + [1] = [2, 1]
-> return [3] + [2, 1] = [3, 2, 1]
-> return [4] + [3, 2, 1] = [4, 3, 2, 1]
-> return [5] + [4, 3, 2, 1] = [5, 4, 3, 2, 1]
def is_palindrome(s):
if len(s) <= 1: # 终止条件
return True
else:
if s[0] == s[-1]:
return is_palindrome(s[1:-1]) # 递归调用
else:
return False
# 调用示例
print(is_palindrome("radar")) # 输出: True
print(is_palindrome("hello")) # 输出: False
递归调用栈示意图(以输入"radar"为例):
is_palindrome("radar")
-> is_palindrome("ada")
-> is_palindrome("d")
-> return True
-> return True
-> return True
def power(base, exponent):
if exponent == 0: # 终止条件
return 1
else:
return base * power(base, exponent - 1) # 递归调用
# 调用示例
print(power(2, 3)) # 输出: 8
递归调用栈示意图:
power(2, 3)
-> 2 * power(2, 2)
-> 2 * power(2, 1)
-> 2 * power(2, 0)
-> return 1
-> return 2 * 1 = 2
-> return 2 * 2 = 4
-> return 2 * 4 = 8