目录
一.递归的概念
①递归的思想
所谓递归,就是把一个大型复杂问题不断转化成一个个规模较小的子问题从而求解,直到子问题不能被拆分。所以递归体现的是一种大事化小的思想
②递归的限制条件
函数在递归的时候存在限制条件,当满足这个限制条件,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。
二.递归的一些典型例子
①求n的阶乘
代码如下:
int Func(int n)
{
if (n ==0)
return 1;//0的阶乘为1
else
return n * Func(n - 1);//逐渐递归
}
int main()
//计算n的阶乘
{
int n;
scanf("%d", &n);//输入n的值
int ret = Func(n);//调用Func函数
printf("%d", ret);
return 0;
}
运行结果如下:
如果用图来描述整个递归过程的话,如下:
②顺序打印一个整数的每一位
题目如下:输入一个整数m,按照顺序打印打印整数的每一位
例如:输入 1234,在屏幕上输出则为:1 2 3 4
要得到整数的每一位,我们只需要对他不断的%10从而得到他的余数,之后我们再对齐/10不断重复直到为0。
代码如下:
void Func(int n)
{
if (n > 9)
{
Func(n / 10);
}
printf("%d ", n%10);
}
int main()
{
int m=0;
scanf("%d", &m);
Func(m);
return 0;
}
如果用图来描述整个递归过程的话,如下:
三.递归与迭代
递归是一种很好的方法,但是每一次调用函数都需要申请一块内存空间用于保存函数调用期间局部变量的值,我们将这块空间称为函数栈帧(后续会由专门一篇讲述函数栈帧)。
函数不返回会导致开辟的栈帧空间过多,从而导致浪费,更严重的会导致栈溢出的问题。
由此,我们引入迭代的思想。所谓迭代,是指利用每一次迭代的结果作为下一次迭代的初始值而不断循环下去。下面我们引入一个比较典型的例子来解读:
例:求出第n个斐波那契数
在求解斐波那契数列的时候,如果我们用递归的思想,那么编译器的运算量会非常大,花费的时间也是我们难以想象的,这个时候就体现出迭代的优点了。用迭代的方法在运行的过程中并不会产生很多重复的运算,比较简洁。
下面我们对比一下两种方法:
首先我们用递归的思想实现斐波那契数列
代码如下:
//用递归的思路实现斐波那契数列
int count = 0;
int Fib(int n)
{
if (n == 3)
count++;//统计n=3被计算的次数
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
printf("count=%d",count);
return 0;
}
可以看出,递归思想实现斐波那契数列的运算量是非常庞大的,引申出来的另一个问题就是非常的耗时。
相反的,如果我们用迭代的思想去实现
代码如下:
int Fib(int n)
{
int a;
int b;
int c;
while (n>=3)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
与递归相比,迭代的实现,大大提高了代码运行的速率。
言尽于此,本次对于函数递归的总结就到此结束了,感谢大家的观看,如有不足欢迎大家指出,你们的批评是我进步的动力。