递归是函数调用自身解决问题的技巧,需满足基础情况(终止条件)和递归情况(规模递减),典型步骤为确定base case、找出递推关系并编码实现,常见陷阱包括缺失base case或未缩小问题规模。
递归是函数调用自身来解决问题的编程技巧,核心在于把大问题拆成结构相同但规模更小的子问题,直到遇到可以直接解决的“基础情况”(base case)。
一个正确的递归函数必须同时满足:
0! = 1 或 1! = 1 就是基础情况。以计算 n 的阶乘(n!)为例:
if (n === 0 || n === 1) return 1;
n! = n × (n−1)!
n * factorial(n - 1)
function factorial(n) {
if (n === 0 || n === 1) return 1; // base case
return n * factorial(n - 1); // recursive case
}递归容易出错,尤其新手常忽略这些细节:
factorial(n) 而不是 factorial(n - 1),也会无限调用结构天然具有自相似性的问题最适用递归:
数 C(n,k))