什么是递归?
- 递归就是函数⾃⼰调⽤⾃⼰
- 递归中的递就是递推的意思,归就是回归的意思
- 如果递归就像循环一样,打一个大的复杂问题转化一个小的问题,但是要与原问题相似,分解成规模较⼩的⼦问题来求解;直到⼦问题不能再被拆分,递归就结束了,所以递归的思考⽅式就是把⼤事化⼩的过程
递归有哪些限制条件?
- 当满⾜这个限制条件的时候,递归便不再继续
- 每次递归调⽤要越来越接近这个限制条件
图画图分析:
我们假设要打印1~3的数字,为了更好地理解我们假设有三个函数函数A、函数B、函数C,,还有一个最后返回的函数(主函数)
在递归回归的过程中就把数字打印了
代码实现:
int digital(int n)
{if (n > 1){digital(n - 1); //递归的限制条件}printf("%-5d", n);}int main()
{int c = 0;digital(10);return 0;
}
出现栈溢出的情况:
错误的代码示例:
int digital(int n)
{if (n > 1){digital(n - 1);}printf("%-5d", n);}int main()
{int c = 0;digital(10000);return 0;
}
报错:
Stack overflow 的意思就是栈溢出的意思
解释:
在每⼀次函数调⽤,都需要为本次函数调⽤在内存的栈区,申请⼀块内存空间来保存函数调⽤期间的各种局部变量的值
当递归递推的很深,都要每一次调用函数为内存申请一块内存空间,越来越多就回益处,所以如果要完成一个任务比较复杂,会浪费很多很多的内存空间的会就不要用递归来解决了,另一种方法就是迭代(就是循环的方法解决问题)
比如:我们打印1~100的数值
#include<stdio.h>
int main()
{int i = 0;for (i = 1; i <= 100; i++){printf("%-5d", i);}return 0;
}
总结:
迭代的方式是比递归的效率高很多,递归有时候使用不当,就会导致一些问题,不好维护,也不要什么要的代码就想着使用递归,适可⽽⽌就好了