📝递归 Fibonacci sequence
直接考虑代码:
if (n <= 2) {
return 1;
}
return Fib(n - 1) + Fib(n - 2);
}
int main() {
int N = 50;
printf("%lld\n",Fib(N));
return 0;
}
时间复杂度:2^0 + 2^1 + 2^2 + ·······+ 2^(n-1) 等比数列求和 2(1 - 2^n) / (1 -2)
时间复杂度O(2^n) — 这里n=10就是2^10 = 1024
递归的斐波那契数列计算到2^40 还可以(1w亿,大概5s),2^50次方就得很久了(规模为1000w亿,5000s)
O(N) — 优化为迭代算法
📝 考虑空间复杂度
直接传入N = 10000,那么这时栈帧就爆了,溢出了(Linux环境下大概8M左右)
那么空间复杂度为O(N),在这里空间是可以重复利用的
,递归先从左边进入,相当于二叉分支,那么栈帧可以重复使用,就是沿着这个树的单个路径向下(考虑最左枝),该路径上每次调用Fib都开一个栈帧,那么叶子节点最大深度为N - 1。到另外一枝,还是重复使用上次开辟的栈帧空间。那么整个空间复杂度就是O(N).