7. 函数递归
7.1 什么是递归?(函数自己调用自己)
程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小
各个程序员写各自的函数模块最后别人要用的时候直接在头文件里包含就行了
把文件设置为静态库这样函数就可以只给别人用,但是不会给别人看内容 各司其职
别人要用就只放 .h 和.lib 两个文件进他的工程就行
实现功能
递归:少量代码实现重复多次的过程(递推+回归)
每次调用函数时 都会在栈上开辟一个空间 (main函数也如此)保存临时变量
栈溢出——>死循环消耗过多栈空间
7.2 递归的两个必要条件(必须要有,但有不一定对)
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
练习:编写函数不允许创建临时变量,求字符串的长度
#include <string.h> #include <stdio.h> int my_strlen(char* str) //用指针接收 { if (*str != '\0') { return 1 + my_strlen(1 + str); //str是数组的脚标 } else { return 0; } } int main() { //编写函数不允许创建临时变量,求字符串的长度(局部变量就叫临时变量) char arr[] = { "aadaed" }; int len = my_strlen(arr); //字符串传参是传的首元素的地址 printf("%d", len); return 0; }
7.3 递归与迭代
7.3.1 练习:求n的阶乘。(不考虑溢出)
#include <stdio.h> int fac(int n) { if (n <= 1) { return 1; } else { return n * fac(n - 1); } } int main() { int n = 0; scanf("%d", &n); int ret = fac(n); printf("%d", ret); return 0; }
求第n个斐波那契数。(不考虑溢出)
以下是递归操作(不太适合,运算太大 速度慢)
int fib(int n) { if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2); } #include <stdio.h> //求第n个斐波那契数。(不考虑溢出) 前两个数和等于第三个数 int main() { int n = 0; scanf("%d", &n); int ret = fib(n); printf("%d", ret); return 0; }