斐波那契額數列:1、1、2、3、5、8、13、21、34…
首先很容易想到遞推關係式:F(n)= F(n-1) + F(n - 2).(n>=3)。
方法1:
int fib1(int n)
{
if (n <= 2)
{
return 1;
}
return fib1(n - 1) + fib1(n-2);
}
方法二:
int fib2(int n)
{
if (n <= 2)
{
return 1;
}
int * array = new int[n + 1];
memset(array, 0, sizeof(int)*(n + 1));
array[1] = array[2] = 1;
return fib2(array, n);
}
//函數重載
int fib2(int * array, int n)
{
if (array[n] == 0)
{
array[n] = fib2(array, n - 1) + fib2(array,n - 2);
}
return array[n];
}
方法三:非遞歸
int fib3(int n)
{
if (n <= 2)
{
return 1;
}
int *array = new int[n + 1];
memset(array, 0, sizeof(int)*(n + 1));
array[1] = array[2] = 1;
for (int i = 3; i <= n; i++)
{
array[i] = array[i - 1] + array[i - 2];
}
return array[n];
}
方法四:非遞歸
//滾動數組
int fib4(int n)
{
if (n <= 2)
{
return 1;
}
int *array = new int[2];
memset(array, 0, sizeof(int)*2);
array[0] = array[1] = 1;
for (int i = 3; i <= n; i++)
{
array[i % 2] = array[(i - 1) % 2] + array[(i - 2) % 2];
}
return array[n % 2];
}
方法五:滾動數組
//滾動數組.模運算的處理
int fib4(int n)
{
if (n <= 2)
{
return 1;
}
int *array = new int[2];
memset(array, 0, sizeof(int) * 2);
array[0] = array[1] = 1;
for (int i = 3; i <= n; i++)
{
array[i & 1] = array[(i - 1) & 1] + array[(i - 2) & 1];
}
return array[n & 1];
}
最近在學習算法,開始填坑啦。後期開始加分析進去。