一、递归的简介
使用递归可以更自然地解决一些问题。例如,像斐波那契数列:数列中的每个数字都是数列中前两个数字的和。凡是需要您构建或遍历树状数据结构的问题基本都可以通过递归来解决,锻炼自己强大的递归思维,你会发现解决这类问题十分容易。
二、数字的递归
每个递归函数都需要一个终止条件,从而使其不会无休止地循环下去。然而,仅仅加一个终止条件,是不足以避免其无限循环的。该函数必须一步一步地接近终止条件。在递归步骤中,问题会逐步简化为更小的问题。
假设有一个函数:从 1 加到 n。例如,当 n = 4,它实现的就是 “1 + 2 + 3 + 4”。
首先,我们需要寻找终止条件。这一步可以认为是找到那个不通过递归就直接结束该问题的条件。当 n 等于 0 时,没法再拆分了,所以我们的递归在到达 0 时停止。
在每一步中,你将从当前数字减去 1。什么是递归条件?就是用减少的数字调用函数sum
。
每一步过程如下:
- 执行sum(4)。
- 4等于0么?否,把sum(4)保留并执行sum(3)。
- 3等于0么?否,把sum(3)保留并执行sum(2)。
- 2等于0么?否,把sum(2)保留并执行sum(1)。
- 1等于0么?否,把sum(1)保留并执行sum(0)。
- 0等于0么?是,计算sum(0)。
- 提取sum(1)。
- 提取sum(2)。
- 提取sum(3)。
- 提取sum(4)。
这是查看函数如何处理每个调用的另一种方式:
我们可以发现,递归条件中的参数不断改变,并逐渐接近并最终符合终止条件。在上面的案例中,我们在递归条件中的每一步都将参数减 1,最后在终止条件中测试参数是否等于 0。