利用斐波那契数列测试递归及非递归算法的时间复杂度(工具:VS2015、C++,赠送精确计算耗时的类代码)

业余时间看了些关于时间复杂度的资料,就想着根据资料写个代码测试一下,本人尚属菜鸟,欢迎各位看官提出宝贵意见及建议~

斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。

1.在VS2015中新建Win32控制台应用程序
2.代码如下:(各位可将如下代码直接复制到.cpp文件中运行)

// FibonacciSequence.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "stdlib.h"
#include "windows.h"
class chronograph//计算时间用的结构体
{
public:
	chronograph()
	{
		QueryPerformanceFrequency(&m_freq);
		QueryPerformanceCounter(&m_bgn);
	}
	void start()
	{
		QueryPerformanceCounter(&m_bgn);
	}

	double duration()
	{
		QueryPerformanceCounter(&m_end);
		return (m_end.QuadPart - m_bgn.QuadPart) * 1000.0 / m_freq.QuadPart;
	}
	LARGE_INTEGER now()
	{
		LARGE_INTEGER now;
		QueryPerformanceCounter(&now);
		return now;
	}
	double DoubleNow()
	{
		LARGE_INTEGER now;
		QueryPerformanceCounter(&now);
		return now.QuadPart*1000.0 / m_freq.QuadPart;
	}
private:
	LARGE_INTEGER m_freq;
	LARGE_INTEGER m_bgn;
	LARGE_INTEGER m_end;
};
int Fibonacci1(int n)//递归算法,时间复杂度O(2^n)
{
	if (n<3)
	{
		return 1;
	}
	else
	{
		return (Fibonacci1(n - 2) + Fibonacci1(n - 1));
	}
}
int Fibonacci2(int n)//非递归算法,时间复杂度O(n)
{
	if (n<3)
	{
		return 1;
	}
	else
	{
		int n1, n2, n3;
		n1 = 1;
		n2 = 1;
		n3 = n1 + n2;
		for (int j = 0; j < n - 2; j++)
		{
			n3 = n1 + n2;
			n1 = n2;
			n2 = n3;
		}
		return n3;
	}
}
int main()
{
	int nInt = 0;
	char * cIn = (char*)malloc(1024);
	chronograph chroTime;
	while (true)
	{
		printf("请输入需要计算第几个斐波那契数列:\n");
		gets_s(cIn, 10);
		nInt = atoi(cIn);
		//非递归算法:
		chroTime.start();
		int nOut2 = Fibonacci2(nInt);
		double dtime2 = chroTime.duration();
		//递归算法:
		chroTime.start();
		int nOut1 = Fibonacci1(nInt);
		double dtime1 = chroTime.duration();
		printf("第%d个斐波那契数列值为:\n%d , 计算耗时:%f毫秒(递归算法)\n%d , 计算耗时:%f毫秒(非递归算法)\n\n", nInt, nOut1, dtime1, nOut2,dtime2);
	}
    return 0;
}

运行结果如下:递归算法及非递归算法比较

可以看到,如果使用递归算法计算斐波那契数列的话,会非常耗时,当计算到第40个数的时候,用时4s多,之后每多计算一个数字,耗时就会翻一倍!
结论:
递归算法,时间复杂度O(2^n)
非递归算法,时间复杂度O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GreenHandBruce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值