递归的缺陷
递归的本质就是压栈和出栈的过程。
递归虽然简洁,但是它也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈中压入数据和弹出数据都需要时间。
一、效率
递归中有可能很多计算都是重复的,从而对性能带来很大的影响。递归的本质是把一个问题分解成多个小问题。如果多个小问题存在相互重叠的部分,那么就存在重复的计算。比如“斐波那契数列”。
二、空间
除了效率之外,递归还有可能引起更严重的问题:调用栈溢出。每个进程的栈的容量是有限的,当递归调用的层级太多时,就会超出栈的容量,从而导致栈举出。
斐波那契数列
#include <iostream>
// 斐波那契数列递归写法,时间复杂度以n的指数方式递增。
long long Fibonacci(unsigned n)
{
if (n <= 0)
return 0;
if (n == 1)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
// 斐波那契数列用循环实现,时间复杂度是O(n)。
long long Fibonacci(unsigned n)
{
int res[] = {0,1};
if (n < 2)
return res[n];
long long first = 0;
long long second = 1;
long long result = 0;
for (unsigned i = 2; i <= n; ++i) {
result = first + second;
first = second;
second = result;
}
return result;
}