#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,总共要运算多少次?