1 递归的数学思想
-
递归是一种数字上分而自治的思想
-
递归需要有边界条件
- 当边界条件不满足时,递归继续进行
- 当边界条件满足时,递归停止
-
递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理
2 递归函数
-
函数体内部可以调用自己
-
递归函数
- 函数体存在自我调用的函数
-
递归函数是递归的数学思想在程序设计中的应用
- 递归函数必须有递归出口
- 函数的无限递归将导致程序栈溢出而崩溃
3 递归函数设计技巧
-
递归模型的一般表示法
- n 为问题的规模,f 为解决方法
[f(n)=left{egin{array}{ll} a_{n} cup f(n-1) &n>1 & \ & \ a_{1} & n==1 end{array} ight. ] -
示例1:用递归的方法编写函数求字符串长度
-
Demo
#include <stdio.h> int strlen_r(const char* s) { if( *s ) { return 1 + strlen_r(s+1); } else { return 0; } } int main() { printf("%d ", strlen_r("abc")); //3 printf("%d ", strlen_r("")); //0 return 0; }
-
-
示例2:斐波拉契数列递归求解法
-
Demo
#include <stdio.h> int fac(int n) { if( n == 1 ) { return 1; } else if( n == 2 ) { return 1; } else { return fac(n-1) + fac(n-2); } return -1; } int main() { printf("%d ", fac(1)); //1 printf("%d ", fac(2)); //1 printf("%d ", fac(9)); //34 return 0; }
-
-
示例3:汉诺塔问题
-
将木块借助 B 柱由 A 柱移动到 C 柱
-
每次只能一个木块
-
只能出现小木块在达姆块之上
-
Demo
#include <stdio.h> //将n个木块从柱子a,借助于柱子b,移动到柱子c void han_move(int n, char a, char b, char c) { if( n == 1 ) { printf("%c --> %c ", a, c); } else { han_move(n-1, a, c, b); han_move(1, a, b, c); han_move(n-1, b, a, c); } } int main() { han_move(3, 'A', 'B', 'C'); return 0; }
-
编译运行
A ---> C A ---> B C ---> B A ---> C B ---> A B ---> C A ---> C
-