牛牛学递归
Posted 超浪*牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛牛学递归相关的知识,希望对你有一定的参考价值。
学习递归,首先得了解递归;
递归的三大要素
- 明确你这个函数要干什么:
对于递归,我觉得很重要的一个事就是明白这个函数的功能是什么,他要完成一件什么事,而这个就看你怎么来定义了。也就是说,不管函数里面是什么代码,而是先明白你这个函数要用来干什么。
//假设做一个求N的阶乘的递归函数
int fun(int N){
//…………内容不管
return /******/;
}
/*现在我们就定义了这个函数,并且明白这个函数的功能*/
- 寻找递归结束条件:
其实递归啊,就是在函数内部代码中再次调用函数本身,所以必须得找出这个递归的出口,也就是递归的结束条件,不然的话,就会陷入一个死循环,无底洞当中。
那也就是说,当参数,特别注意是参数,当参数为啥时,递归结束,之后直接把值返回。这里就类似于浅谈经验:你仔细想,这个时候我们一定能够根据最后这个参数的值,直接能够得知的函数结果是什么。
例如:上面的函数中当N = 1;时,函数fun(N);返回值是几?fun(1) = 1;,那我们接下来就完善代码;
int fun(int N){//设置N != 0;
if(N == 1){
return 1;
}
}
那么有人也会说,我也知道fun(2) 返回2呀,可不可以作为递归出口呢?其实你只要知道这个参数返回的正确结果,那么以这个参数作为结束条件是完全可以的。
就写成下面的描述
int fun(int N){//假设N>=2的,注意因为这样写的话就会漏掉参数 n=1时的返回值,不严谨!!!
if(N == 2){
return 2;
}
}
/*===我们也可以发现当N<=2时fun(N) = N;所以我们还可以写成这样 ====*/
int fun(int N){
if(N <= 2){
return N;
}
}
- 找出函数的等价关系
就是不断缩小参数的取值范围,缩小之后,通过一些辅助变量或者操作,使得原函数的结果不变,例如咋们这个求阶乘的函数:fun(N)的范围较大,我们可以让fun(N) = N * fun(N-1)。这样这个范围就变成了fun(N-1),但是函数因为乘了N,也就保持原函数值不变。说白了就是要找到原函数的一个等价关系式,fun(N)的等价关系式就是fun(N)= N * fun(N-1)。这个等价关系式的寻找,可以说是最难的一步了,当然大神除外……。
那咋们继续完善这个程序,把等价式写进函数里。
int fun(int N){
if(N <= 2){
return N;
}//把fun(N)的等价式写过来
return N*fun(N-1);
}
至此,通过这三要素的三个步骤,一个比较简单的递归程序就写好了,那么对于我们来说每次做递归的时候,强迫自己去找寻这三个要素,后续和我一起多多练题,熟练掌握递归。之后咋们在考虑如何优化递归等,(ps:此篇文章仅作为基础的递归读文,小白仔细看,大佬请随意,可以直接拉到最下面留给我些建议,万分感谢“帅地”大佬,做好程序员的内功修炼)
完整代码描述:
#include<stdio.h>
int fun(int N){
if(N <= 2){
return N;
}
return N*fun(N-1);
}
int main(){
printf("%d",fun(5));
return 0;
}
以上是关于牛牛学递归的主要内容,如果未能解决你的问题,请参考以下文章