递归时间/空间复杂度的分析(斐波那契为例)

写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。

目录:
1.斐波那契递归代码实现
2.斐波那契的时间复杂度的详细分析
3.斐波那契的空间复杂度详细分析

1.斐波那契递归代码实现

int Fibonacci(int n)
{
   if(n==1||n==2)
   return 1;
   else
   return Fibonacci(n-1)+Fibonacci(n-2);
}

2.斐波那契的时间复杂度的详细分析

我们来看一个当n=5的时候递归代码如何执行的(没完全展开):

在这里插入图片描述

二叉树的高度是 n - 1,由我们的基础知识可以知道,一个高度为k的二叉树最多可以由 2k- 1个叶子节点,也就是递归过程函数调用的次数,所以时间复杂度是:

O(2n)

当然这只是针对斐波那契数列,汉诺塔等等,如果是其他的递归可能又会不同。当然当代码的时间复杂度为指数级的时候,随着参数的变大,程序的效率是非常低下的,而且当n值过大,容易产生栈溢出的可能,明显这样的递归方法是低效的

3.斐波那契的空间复杂度详细分析

还拿n==5来说

在这里插入图片描述

①-③:调用Fib(5),首先需调用Fib(4),Fib(4)要先调用Fib(3),逐步调用直至返回Fib(2)的值1,Fib执行结束,所创建空间销毁。此时Fib(5)、Fib(4)、Fib(3)均未调用结束,程序共占用4个函数栈帧空间。

④-⑨:Fib(2)执行结束,接下来调用Fib(1),创建一个函数栈帧空间,调用结束返回1后,该空间销毁,此时可得到Fib(3)=2,通过第⑦步返回Fib(3)的值,第⑧步同样创建空间再次调用Fib(2),调用结束销毁空间,此时可得到Fib(4)=3,通过第⑨步返回Fib(4)的值,此过程最大占用4个函数栈帧空间。

⑩-···:最后和上面一样,调用Fib(3),将返回值传给Fib(5)的模块,最终得到Fib(5)=5。

整个程序执行过程中,最多占用4个函数栈帧空间的大小,4就是整个二叉树的深度,而其树的深度有是n-1

所以:

斐波那契的空间复杂度就是树的深度 S(n)

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107570149