递归求斐波那契数列
解法1:时间复杂度为O(2^n)
int fibonacci(int i)
{
if(i <= 0)
return 0;
if(i == 1)
return 1;
return fibonacci(i-1) + fibonacci(i-2);
}
该递归算法的时间复杂度为O(2^n),这个复杂度是非常大的,随着n的增大,耗时是指数上升的。
解法2:时间复杂度为O(n)
// 版本二
int fibonacci(int first, int second, int n) {
if (n <= 0) {
return 0;
}
if (n < 3) {
return 1;
}
/** 上面两种解法的目的并不是用于递归,二是在输入参数n本身实际就小于3的情况下使用*/
/** 下面的(n == 3)才是递归终止条件*/
else if (n == 3) {
return first + second;
}
else {
return fibonacci(second, first + second, n - 1);
}
}
int main()
{
int n = 10;
fibonacci_3(1, 1, n);
return 0;
}
递归的次数 * 每次递归的时间复杂度。
递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度
为什么要求递归的深度呢?
因为每次递归所需的空间都被压到调用栈里(这是内存管理里面的数据结构,和算法里的栈原理是一样的),一次递归结束,这个栈就 是就是把本次递归的数据弹出去。所以这个栈最大的长度就是递归的深度。