牛牛学递归

学习递归,首先得了解递归;

递归的三大要素

  1. 明确你这个函数要干什么:

对于递归,我觉得很重要的一个事就是明白这个函数的功能是什么,他要完成一件什么事,而这个就看你怎么来定义了。也就是说,不管函数里面是什么代码,而是先明白你这个函数要用来干什么。

//假设做一个求N的阶乘的递归函数
int fun(int N){
     
	//…………内容不管
	return /******/;
}
/*现在我们就定义了这个函数,并且明白这个函数的功能*/
  1. 寻找递归结束条件:

其实递归啊,就是在函数内部代码中再次调用函数本身,所以必须得找出这个递归的出口,也就是递归的结束条件,不然的话,就会陷入一个死循环,无底洞当中。
那也就是说,当参数,特别注意是参数,当参数为啥时,递归结束,之后直接把值返回。这里就类似于浅谈经验:你仔细想,这个时候我们一定能够根据最后这个参数的值,直接能够得知的函数结果是什么。
例如:上面的函数中当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;
	}
}
  1. 找出函数的等价关系

就是不断缩小参数的取值范围,缩小之后,通过一些辅助变量或者操作,使得原函数的结果不变,例如咋们这个求阶乘的函数: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
int fun(int N){
     
	if(N <= 2){
     
		return N;
	}
	return N*fun(N-1);
} 
int main(){
     
	printf("%d",fun(5));
	return 0;
} 

你可能感兴趣的:(小白练算法,笔记,算法,递归算法)