问题:
// 计算斐波那契递归Fib的时间复杂度和空间复杂度
long long Fib(size_t N){
if(N < 3){
return 1;
}
return Fib(N-1) + Fib(N-2);
}
画图分析:
总结:
1.时间复杂度分析:
对于输入N,函数Fib(N)会调用Fib(N-1)和Fib(N-2)。这两个调用是独立的,并且每个调用都会进一步产生两个新的调用,依此类推。
这种递归结构可以看作是一棵二叉树,树的每个节点代表一个函数调用。树的深度等于输入N。
在二叉树中,节点的数量是指数级的。具体来说,对于深度为N的树,节点的数量是2^N。每个节点都需要执行一定的计算(加法和减法),因此总体的时间复杂度是O(2^N)。
2.空间复杂度分析:
空间复杂度通常考虑的是程序运行时所需要的额外空间,不包括存储输入本身的空间。
在这个递归函数中,每次函数调用都会在调用栈上分配一块空间来保存函数的返回地址和局部变量。当函数返回时,这块空间会被释放。空间被释放是向进程归还内存的使用权,这个空间还可以被重复利用的。
最坏情况下,递归的深度是N(即输入的大小)。因此,在调用栈上需要分配N块空间来保存这些递归调用的信息。
需要注意的是,虽然每个递归调用都会返回一个值,但这些返回值是通过寄存器传递的,不占用额外的栈空间。因此,我们只考虑调用栈上的空间。
综上所述,空间复杂度是O(N)。
(时间要累计计算,空间可重复使用不累计计算)
通过以上的分析,我们可以得出结论:这段代码的时间复杂度是O(2^N),空间复杂度是O(N)。这意味着随着输入N的增加,计算斐波那契数列的时间将呈指数级增长,而所需的额外空间将线性增长。