Fibonacci公式总结如下:
/ 1 n=1
f(n)= 2 n=2
/ 1 n=1
f(n)= 2 n=2
\ f(n-1) + f(n-2) n>2
从公式中可以发现,f(n) 是 f(n-1) 和f(n-2)之和,可以使用递归求解。但是递归的时间复杂度是O(2^n),采用递归求解时,我们可以发现有大量的子问题会被重复计算。
如果我们把子问题都记录下来,就可以在O(n)的时间复杂度和O(n)的空间复杂度内求解。求解这道题的思想是将大问题划分为很多的小问题,然后先求解小问题,并将小问题的结果保存,以便计算大问题。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAXLENGTH 10
void print(int *arr)
{
int i;
for(i=1; i<=MAXLENGTH; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int fibonacci(int n)
{
int * arr = (int *) malloc(sizeof(int)*(n+1));
memset(arr, 0, sizeof(int)*(n+1));
int i;
arr[1] = 1;
arr[2] = 2;
for(i=3; i<=n; ++i)
{
arr[i] = arr[i-1] + arr[i-2];
}
print(arr);
free(arr);
}
int main()
{
fibonacci(MAXLENGTH);
}