2023-05-19 05:18:41
递归是一种通过函数调用自身来解决问题的方法,特别适合处理具有自相似结构的问题。下面从基本概念、实现要素、经典案例和调试技巧等方面系统介绍递归函数。
递归可类比为俄罗斯套娃的打开过程:
void openMatryoshka(int size) { if(size == 1) { // 基本情况 cout << "打开最小的娃娃!" << endl; return; } cout << "打开大小为" << size << "的娃娃" << endl; openMatryoshka(size - 1); // 递归调用}
递归三要素:
数学定义:n! = n × (n-1) × ... × 10! = 1
递归实现:
int factorial(int n) { if(n == 0 || n == 1) return 1; // 基本情况 return n * factorial(n - 1); // 递归关系}调用过程:
factorial(4)= 4 * factorial(3)= 4 * (3 * factorial(2))= 4 * (3 * (2 * factorial(1)))= 242. 斐波那契数列数列定义:F(0) = 0F(1) = 1F(n) = F(n-1) + F(n-2) (n ≥ 2)
基础递归解法:
int fibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; return fibonacci(n-1) + fibonacci(n-2);}效率问题:存在大量重复计算,如计算F(5)时F(2)被计算3次。
优化方案(记忆化):
int fibMemo(int n, vector<int>& memo) { if(n <= 1) return n; if(memo[n] != -1) return memo[n]; memo[n] = fibMemo(n-1, memo) + fibMemo(n-2, memo); return memo[n];}int fibonacci(int n) { vector<int> memo(n+1, -1); return fibMemo(n, memo);}解法:
void hanoi(int n, char from, char to, char aux) { if(n == 1) { cout << "将盘子1从" << from << "移动到" << to << endl; return; } hanoi(n-1, from, aux, to); cout << "将盘子" << n << "从" << from << "移动到" << to << endl; hanoi(n-1, aux, to, from);}调用示例:hanoi(3, 'A', 'C', 'B');
2. 十进制转二进制void decToBinary(int n) { if(n == 0) return; decToBinary(n / 2); cout << n % 2;}// 调用示例:decToBinary(10); 输出10103. 最大公约数(欧几里得算法)int gcd(int a, int b) { if(b == 0) return a; return gcd(b, a % b);}// 调用示例:gcd(48, 18)返回6任何递归算法都可以转换为迭代形式(使用栈):
// 迭代版阶乘int factorialIter(int n) { int result = 1; for(int i = 1; i <= n; i++) { result *= i; } return result;}递归是强大的编程工具,但需要谨慎使用以避免性能问题和错误。理解递归三要素和掌握调试技巧是有效使用递归的关键。