首先需要建立一个思想,时间是一去不回的,内存空间是有限的的。所以时间是不断增加,空间会被收回。
// 计算斐波那契递归Fib的时间复杂度? long long Fib(size_t N) { if (N < 3) return 1; return Fib(N - 1) + Fib(N - 2); }
大致罗列一个框架,可以发现每进行一次递归,他的执行次数就会翻一倍,也就是x2。这个可以看做是一个首项是1,等比值为2的等比数列。那么我们求时间复杂度就可以转换为求这个等比数列之和,就可以直接利用现有公式算出结果为2(N-1)-1,然后通过渐进表示法,就可以得到时间复杂度:O(2N);
计算机为我们程序分配的空间是有限的,如果调用多少次就开辟多少空间,那么内存肯定是不够的,所以内存必然会收回。分析一下代码,Fib(N - 1) + Fib(N - 2),在Fib(N - 1)没有小于3之前,一直是在给Fib(N - 1)开辟空间,当Fib(N - 1)小于3之后,开辟的空间又逐个进行收回,返回到第一个Fib(N - 2)之后,重复之前的操作。所以空间复杂度为O(N)。