点击链接加入群【C语言】:http://jq.qq.com/?_wv=1027&k=2H9sgjG


    

好啦,上一节介绍了静态库的创建,今天来介绍点什么呢?

这一节再来讨论一下函数吧,我们已经知道在函数A中可以调用函数B,其实就是让CPU从A中跳转到B的代码处执行,那么如果是A调用A呢?很多人不能理解这个过程,是因为他们没看懂第六小节,也就是函数调用过程那一小节啦,我们称函数调用自己为递归调用,我们已经知道函数调用是要使用栈空间的,如果这个调用一直持续下去,那么会出现什么问题呢?栈都会被你撑爆了啦。哈哈,你很牛啊!示例如下

C语言入门篇-11_C语言学习

看到了吧,栈溢出啦。恩,你很厉害了。

所以说嘛,栈是有大小的啦。当然,我们现在也只是粗略的观察一下啦。

那么自己调用自己,就必须要有返回的时候,不然就会出现上面的情况啦,所以一般递归函数会有一个返回的情况 ,举个例子,求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开始的哦。

这就是递归版的求数组最大值啦。 是不是很好玩呢?所以,记住一点,递归一定要有出口,不然会栈溢出啦。还有就是递归层次不要太深啦,因为会占用太多的栈空间啦,以后数据结构中的树就是用的这个递归的原理啦。。。所以说嘛,这小节还是很有帮助的哦。再见!。。。