如何理解递归?写了这么多年代码,我居然今天才会使用递归,所以想告诉大家,递归思想不难,但是有需要注意的点。
递归是一种算法设计技巧,它的基本思想是通过将问题分解成更小的子问题来求解,直到问题足够简单,可以直接解决。这种“自我调用”的方式在很多问题中非常有效。
为了更好地理解递归,以下是递归的几个关键点:
- 基线条件:这是递归停止的条件。当问题变得足够小,不再需要进一步递归时,递归调用就会停止并返回结果。
- 递归步骤:这是递归的核心部分,在每次递归中,问题被分解成一个或多个更小的子问题,并通过递归解决这些子问题。
递归的简单例子:阶乘计算
计算 n!
(n的阶乘)是一个经典的递归例子。阶乘的定义是:
0! = 1
n! = n * (n-1)!
,对于 n > 0
def factorial(n):
# 基线条件:当 n 等于 0 时,返回 1
if n == 0:
return 1
# 递归步骤:n * (n-1) 的阶乘
else:
return n * factorial(n - 1)
阶乘递归计算过程
假设我们要计算 5!
,递归的过程如下:
factorial(5)
会调用5 * factorial(4)
factorial(4)
会调用4 * factorial(3)
factorial(3)
会调用3 * factorial(2)
factorial(2)
会调用2 * factorial(1)
factorial(1)
会调用1 * factorial(0)
factorial(0)
返回 1 (基线条件)- 递归返回并计算结果:
factorial(1)
返回1 * 1 = 1
factorial(2)
返回2 * 1 = 2
factorial(3)
返回3 * 2 = 6
factorial(4)
返回4 * 6 = 24
factorial(5)
返回5 * 24 = 120
最终结果 5! = 120
。
斐波那契数列的例子
斐波那契数列的定义如下:
- F(0) = 0
- F(1) = 1
- 对于 n ≥ 2, F(n) = F(n-1) + F(n-2)
斐波那契数列是这样排列的:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
。它的每一项是前两项的和。
递归实现斐波那契数列
我们可以用递归来实现这个数列:
def fibonacci(n):
# 基线条件:F(0) = 0 和 F(1) = 1
if n == 0:
return 0
elif n == 1:
return 1
# 递归步骤:F(n) = F(n-1) + F(n-2)
else:
return fibonacci(n-1) + fibonacci(n-2)
递归计算过程
假设我们要计算 F(5)
,递归过程如下:
- fibonacci(5) 会调用
fibonacci(4) + fibonacci(3)
- fibonacci(4) 会调用
fibonacci(3) + fibonacci(2)
- fibonacci(3) 会调用
fibonacci(2) + fibonacci(1)
- fibonacci(2) 会调用
fibonacci(1) + fibonacci(0)
- fibonacci(1) 返回 1
- fibonacci(0) 返回 0
回溯过程中,逐步计算:
fibonacci(2)
返回1 + 0 = 1
fibonacci(3)
返回1 + 1 = 2
fibonacci(4)
返回2 + 1 = 3
fibonacci(5)
返回3 + 2 = 5
最终结果 F(5) = 5
。
测试题:
看了以上两个例子,自己编一个简单的递归吧,实现对正整数n,从1到n求和
如果轻松编出来,就代表你已经理解递归了