Fibonacci

#include <stdio.h>
#include <assert.h>
#include <time.h>
#include <stdlib.h>

time_t Fibonacci_GetTime()
{
	time_t stTime = 0;
	stTime = time(0);
	
	printf("%ld\r\n", stTime);
	return stTime;
}

unsigned int *puiCnt = NULL; 
int Fibonacci_Array(int iNum)
{
	int iLoop;
	
	if (iNum <= 0)
	{
		return -1;
	}

	puiCnt = (int *)malloc((iNum + 1) * sizeof(unsigned int));
	if (NULL != puiCnt)
	{
		for(iLoop = 0; iLoop <= iNum; iLoop++)
		{
			puiCnt[iLoop] = 0xffffffff;
		}
	}

	return 0;
}


unsigned int Fibonacci_Cache(int iNum)
{
	unsigned int uiRet = 0;

	assert(iNum >= 0);

	if (0xffffffff != puiCnt[iNum])
	{
		return puiCnt[iNum];
	}

	if (iNum > 1)
	{
		uiRet = Fibonacci_Cache(iNum - 1) + Fibonacci_Cache(iNum - 2);	
	}
	else if (1 == iNum)
	{
		uiRet = 1;
	}
	puiCnt[iNum] = uiRet;

	return uiRet;		
}

unsigned int Fibonacci_Recursion(int iNum)
{
	unsigned int uiRet = 0;
	
	assert(iNum >= 0);

	if (iNum > 1)
	{
		uiRet = Fibonacci_Recursion(iNum - 1) + Fibonacci_Recursion(iNum - 2);	
	}
	else if (1 == iNum)
	{
		uiRet = 1;
	}
	
	return uiRet;
}

unsigned int Fibonacci_Iterate(int iNum)
{
	unsigned int uiRet = 0;
	unsigned int uiFirstPrev = 0;
	unsigned int uiSecondPrev = 0;
	int iLoop = 0;

	assert(iNum >= 0);

	if (iNum <= 1)
	{
		return 1;
	}

	uiFirstPrev = 1;
	uiSecondPrev = 0;	
	for(iLoop = 2; iLoop <= iNum; iLoop++)
	{
		
		uiRet = uiFirstPrev + uiSecondPrev;
		uiSecondPrev = uiFirstPrev;
		uiFirstPrev = uiRet;
	}
	
	return uiRet;
	
}

int main()
{
	unsigned int uiResult = 0;
	int iNum = 100;

	Fibonacci_GetTime();

	uiResult = Fibonacci_Recursion(iNum);
	printf("Recursion : %u \r\n", uiResult);
	Fibonacci_GetTime();
	
	Fibonacci_Array(iNum);
	uiResult = Fibonacci_Cache(iNum);
	printf("Cache : %u \r\n", uiResult);
	Fibonacci_GetTime();

	uiResult = Fibonacci_Iterate(iNum);
	printf("Iterate : %u \r\n", uiResult);
	Fibonacci_GetTime();

	return 0;
}

运行结果:

1417611128
Recursion : 102334155 
1417611130
Cache : 102334155 
1417611130
Iterate : 102334155 
1417611130

遗留问题:

递归算法复杂度?

递归算法1,总共要运算多少次?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值