递归就是函数自己调用自己,递归方案虽然简洁,但是效率却没有循环高。递归虽然为某些编程问题提供了最简单的解决方案,但一些递归算法会快速消耗计算机的内存资源。递归也不方便阅读和维护。
以斐波那契数列来举例。我们首先定义一个Fibonacci()函数。
unsigned long Fibonacci(unsigned n)
{
if (n>2)
return Fibonacci(n-1) + Fibonacci(n-2)
else
return 1;
}
在这个函数中,每级递归创建的变量都是上一级递归的两倍,所以变量的数量呈指数增长。很快就消耗掉计算机的大量内存,很可能导致程序的崩溃。所以在考虑效率优先的程序时,使用递归要特别注意。
于是我们考虑用循环代替递归计算斐波那契数。
在此我使用的是for循环。
#define _CRT_SECURE_NO_WARNINGS//VS编译器
#include<stdio.h>
//循环代替递归计算斐波那契数列
void Fibonacci(int n);
int main(void)
{
int n;
scanf("%d", &n);
Fibonacci(n);
return 0;
}
void Fibonacci(int n)
{
int n1 = 1, n2 = 1;
printf("1 1 ");
for (int i = 3;i <= n;i++)
{
int n3 = n1 + n2;
n1 = n2;
n2 = n3;
printf("%d ", n3);
}
}
一般而言,选择循环比较好。首先,每次递归都会创建新的变量,所以递归会使用更多的内存,递归调用的数量受限于内存空间。其次,每次函数调用都会花费一定的时间,所以递归执行的速度较慢。
当然递归也有递归的优点,有它存在的意义。在写代码的时候要具体情况具体分析,选择递归还是选择循环。