递归的数学思想递归是一种数学上分而自治的思想递归需要边界条件当边界条件不满足时,递归继续进行当边界条件满足时,递归停止递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理。递归函数函数体内部可以调用自己递归函数函数体中存在自我调用的函数递归函数是递归的数学思想在程序设计中的应用递归函数必须有递归出口函数的无限递归将导致程序栈溢出而崩溃递归函数设计技巧递归模型的一般表示法递归函数设计示例 一用递归的方法编写函数求字符串长度递归版 strlen#include <stdio.h>int strlen_r(const char* s){ if( *s != ‘\0’ ) { return 1 + strlen_r(s + 1); } else { return 0; }}int main(){ printf("%d\n", strlen_r(“abc”)); printf("%d\n", strlen_r("")); return 0;}输出:printf("%d\n", strlen_r(“abc”));printf("%d\n", strlen_r(""));递归函数设计示例 二斐波拉契数列递归解法1, 1, 2, 3, 5, 8, 13, 21, …编程实验:斐波拉契数列#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\n", fac(1)); printf("%d\n", fac(2)); printf("%d\n", fac(9)); return 0;}输出:1134递归函数设计示例 三哈诺塔问题将木块借助 B 柱由 A 柱移动到 C 柱每次只能移动一个木块只能出现小木块在大木块之上汉诺塔问题分解将 n-1 个木块借助 C 柱由 A 柱移动到 B 柱将最底层的唯一模块直接移动到 C 柱将 n-1 个木块借助 A 柱由 B 柱 移动到 C 柱编程实验: 汉诺塔问题求解#include <stdio.h>void han_move(int n, char a, char b, char c){ if( n == 1 ) { printf("%c –> %c\n", 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 –> CA –> BC –> BA –> CB –> AB –> CA –> C小结递归是一种将问题分而自治的思想用递归解决问题首先要建立递归的模型递归解法必须要有条件边界,否则无解以上内容参考狄泰软件学院系列课程,请大家保护原创!