----此节内容于C语言课程已分析过,但递归在----
----后续数据结构课程中使用众多,所以再次----
----分析,加深理解----
1、递归的思想与应用
递归是—种数学上分而自治的思想
-将原问题分解为规模较小的问题进行处理
分解后的问题与原问题的类型完全相同,但规模较小
通过小规模问题的解,能够轻易求得原问题的解
-问题的分解是有限的(递归不能无限进行)
当边界条件不满足时,分解问题(递归继续进行)
当边界条件满足时,直接求解(递归结束)
递归模型的一般表示法
递归在程序设计中的应用
-递归函数
函数体中存在自我调用的函数
递归函数必须有递归出口(边界条件)
函数的无限递归将导致程序崩溃
递归思想的应用
-求解: Sum(n) = 1 + 2 + 3 +…+n
2、编程实验
递归求和 unsigned int sum(unsigned int n)#include <iostream> using namespace std; unsigned int sum(unsigned int n) { if(n > 1) return n + sum(n - 1); else return 1; } int main() { cout<<sum(100)<<endl; return 0; }
斐波拉契数列
-数列自身递归定义: 1, 1, 2, 3, 5, 8, 13, 21, …
3、编程实验
斐波拉契数列 unsigned int Fibonacci(unsigned int n)#include <iostream> using namespace std; unsigned int fib(unsigned int n) { if(n > 2) return fib(n - 1) + fib(n - 2); if(n == 1 || n == 2) return 1; return 0; } int main() { for(int i=1;i<10;i++) cout<<fib(i)<<endl; return 0; }
用递归的方法编写函数求字符串长度
4、编程实验
递归方法求字符串长度unsigned int strlen(const char* s)#include <iostream> using namespace std; unsigned int _strlen_(const char* s) { // if(*s != '\0') // return 1 + _strlen_(s + 1); // else // return 0; return s ? ( *s ? (1 + _strlen_(s + 1)) : 0 ) : 0; } int main() { cout<<_strlen_("nyist")<<endl; return 0; }
5、小结
递归是一种将问题分而自治的思想
用递归解决问题首先要建立递归的模型
递归解法必须要有边界条件,否则无解
不要陷入递归函数的执行细节,学会通过代码描述递归问题