点击链接加入群【C语言】:http://jq.qq.com/?_wv=1027&k=2H9sgjG
好啦,上一节介绍了静态库的创建,今天来介绍点什么呢?
这一节再来讨论一下函数吧,我们已经知道在函数A中可以调用函数B,其实就是让CPU从A中跳转到B的代码处执行,那么如果是A调用A呢?很多人不能理解这个过程,是因为他们没看懂第六小节,也就是函数调用过程那一小节啦,我们称函数调用自己为递归调用,我们已经知道函数调用是要使用栈空间的,如果这个调用一直持续下去,那么会出现什么问题呢?栈都会被你撑爆了啦。哈哈,你很牛啊!示例如下
看到了吧,栈溢出啦。恩,你很厉害了。
所以说嘛,栈是有大小的啦。当然,我们现在也只是粗略的观察一下啦。
那么自己调用自己,就必须要有返回的时候,不然就会出现上面的情况啦,所以一般递归函数会有一个返回的情况 ,举个例子,求N!
#include <stdio.h> int fun(int n) { if(n==1) return 1; else return n*fun(n-1); } int main() { printf("%d\n",fun(5)); return 0; }
当n==1的时候返回1,否则就返回 n*fun(n-1) ;很容易理解吧,那么现在提问一个小问题,我们的结果 120 是 怎么计算出来的呢?1*2*3*4*5 还是 5*4*3*2*1 呢?也就是 是先计算出来的1*2 ,还是先计算出来 5*4 呢? 当你想明白这个的时候就会懂的递归啦。
递归其实是一种思想啦,当问题符合递归思想的时候就可以用递归来求解啦。
如:举个例子,求一个数组的最大值
要想求出arr[10]中的最大值,我们可以先求arr中前9个的最大值,然后与arr[10]比较,取其大值为结果,对于前9个数,我们又可以这样想,先求arr中前8个的最大值,然后再与arr[9]比较,取其大值为结果,就是这种思想啦,这个需要大家慢慢揣摩滴 ,哈哈。
给出示例代码
#include <stdio.h> int ArrayMax(int arr[],int len) { if(len==1) return arr[0]; else return (ArrayMax(arr,len-1) > arr[len])?ArrayMax(arr,len-1):arr[len]; } int main() { int arr[]={2,5,3,6,8,10,4,1,0,9,-15}; printf("%d\n",ArrayMax(arr,sizeof(arr)/sizeof(arr[0]) -1 )); return 0; }
注:在调用函数时,我们传的元素个数 -1 ,是因为 数组的下标是从0开始的哦。
这就是递归版的求数组最大值啦。 是不是很好玩呢?所以,记住一点,递归一定要有出口,不然会栈溢出啦。还有就是递归层次不要太深啦,因为会占用太多的栈空间啦,以后数据结构中的树就是用的这个递归的原理啦。。。所以说嘛,这小节还是很有帮助的哦。再见!。。。