在C语言里函数递归是什么呢?我的理解是函数自己调用自己,但是不能一直调用,有限制条件,当满足限制条件后,函数停止调用。说到这我就想说一下我对函数的理解,函数我理解为实现某种功能的一串代码,由于函数讲究高内聚低耦合,所以我们写的函数往往都是要功能尽可能的功能单一,与其他函数少关联。那么函数递归就可以理解为函数的功能被重复实现。举个例子:求斐波那契数列第n个数。
我们要写一个函数,该函数是来求斐波那契数列第n个数字的,那么第n-1个数字也可以用这个函数来求,函数形式为Fibo(n-1);同样第n-2个数字可以用这个函数来求,函数形式为Fibo(n-2);我们知道斐波那契数列的数字特点为:从第三位开始,每一位数字为其前两位数字的和,第一个和第二个数字均为1,那么就不难写出求斐波那契数列第n个数字的语句形式:
int Fibo(int n)
{
return Fibo(n - 1) + Fibo(n - 2);
}
:接着我们来写函数递归的限制条件。根据上面写的函数语句,可以发现我们求第n个斐波那契数是从后往前求得,往前推算并非是无尽头的的,因为斐波那契数列最前的两个数均为1,那么限制条件就可以得出了:
int Fibo(int n)
{
if (n > 2)
return Fibo(n - 1) + Fibo(n - 2);
else
return 1;
}
不过,这个求第n个斐波那契数数列的函数是有缺陷的,他不能求n太大的斐波那契数,原因在于函数递归是不停的调用函数,而调用一次函数是需要在栈区开辟一块空间的,而栈区的大小是有限的,当递归次数太多就可能因为栈溢出而计算不出结果,所以关于采用递归还是迭代实现某种功能,是需要我们来思考的。
我再讲讲关于递归和迭代,我的一些理解。递归前文我也说道,是从后往前计算,而迭代是从前往后计算。举个相同的例子:求第n个斐波那契数。那么从前往后怎么思考呢,我们知道斐波那契数列前两个数均为1,那么第三个数为2,第四个数为3,第五个数位5,第六个数位8,以此类推。假设a为第一个数,b为第二个数,c为第三个数,那么等式语句就可以写出c=a+b,求出来第三个数后,求第四个数,那么此时第二个数为a,第三个数为b,第四个数为c,同样的表达式就可以求出第四个数;同理求第五个数,那么第三个数为a,第四个数为b,第五个数位c,同样的表达式第五位数也可以求出;以此类推,通过a,b求出来c后,立马将a,b重置,为下次计算做准备,而c就是我们要求的第n个斐波那契数,代码为:
int main()
{
int n = 0;
scanf("%d", &n);
int a = 1;
int b = 1;
int c = 0;
for(int num = 3; num <= n; num++)
{
c = a + b;
a = b;
b = c;
}
printf("%d", c);
}
同过迭代实现的函数功能,是不存在栈溢出的,因此无论是后面多大的斐波那契数,只要它存在,我们就可以求出来,这也就提醒我们采用递归还是迭代是需要我们根据情况决定的。