对于递归函数最简单的概括就是自身函数调用自身,最经典的例子就是斐波那契数列。通过斐波那契数列的例子我来聊聊我个人对于递归函数的理解,下面请看实例:
//递归实现
#include <stdio.h>
int Fib(int n)
{
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);
return 0;
}
这是一个非常典型的递归实现斐波那契数列的程序,其主要思想就是:将大事化小。通过这个实例,我们也能看出递归函数需要存在限制条件,当满足这个限制条件的时候,递归便不再继续,
并且每次递归调用之后越来越接近这个限制条件。
而当我们进行测试之后会发现,到40左右的时候,程序运行速度会变得越来越慢,这是由于使用递归函数其中很多计算都被重复计算了不知多少次,导致程序运行起来实际效率并不高,尤其是对于这些大数字。而我们使用非递归函数来实现则会大大提高我们的运行速率:代码如下:
#include <stdio.h>
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}
这样一来就会大大提高运行速率,但这样子有一个问题就是:计算有时会出现错误,但是这并不是由于代码错误而引发的,而是由于栈溢出所致,具体的原因等日后我有了更深的理解在进行深一度的解释。