探讨递归的Fibonacci sequence(斐波那契数列)的时间复杂度


📝递归 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).


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值