时间复杂度
递归
//递归算法
long long fib1(size_t N)
{
if (N < 2)
return N;
return fib1(N - 1) + fib1(N - 2);
}
int main()
{
printf("%lld\n", fib1(6));
system("pause");
return 0;
} //递归可以使程序看起来比较简洁,但缺点是效率比较低,并且可能导致栈溢出,当需要计算的数稍大一点,就需要很长的计算时间,因此需要灵活使用递归。
递归时间复杂度,以6为例它可以画成一个类似二叉树的样子,虽然不是满二叉树,但是时间复杂度看的都是最坏的结果,所以我们可以暂时将他看成满二叉树,这样的话节点数就是它的次数,高度为h,节点数=2^h-1, 即O(2 ^n)
递归的时间复杂度是: 递归次数*每次递归中执行基本操作的次数,所以时间复杂度是: O(2^N)
非递归
#define _CRT_SECURE_NO_WARNINGS 1
//非递归算法
#include<stdio.h>
#include<stdlib.h>
long long fib1(size_t N)
{
int a = 0, b = 1, c = 0;
if (N < 2)
{
return N;
}
else
{
for (int i = 2; i <= N; ++i)
{
c = a + b;
a = b;
b = c;
}
}
return c;
}
int main()
{
printf("%lld\n", fib1(6));
system("pause");
return 0;
} //此算法最大的优点是不存在重复计算,故效率比递归算法快的多得多。
非递归时间复杂度,由于计算了n-1次:
即时间复杂度为:O(n)
空间复杂度
递归
递归最深的那一次所耗费的空间足以容纳它所有递归过程。递归产生的栈侦是要销毁的,所以空间也就释放了,要返回上一层栈侦继续计算+号后面的数,所以它所需要的空间不是一直累加起来的,之后产生的栈侦空间都小于递归最深的那一次所耗费的空间。
递归的深度*每次递归所需的辅助空间的个数
所以:空间复杂度是O(N)
非递归
由于辅助空间是常数级别的
所以:空间复杂度是O(1);