#include<stdio.h> #include<stdlib.h> #include<string.h> # define N 21 //只是为了实现算法 不处理过大的数就现在而言 long f[N] = {0,1,1};//为了统一 抛弃f[0] long fibonaccil_1(int n) { int i = 0; if (n==1||n ==2) return 1; for(i = 3;i <= n ; i ++) f[i] = f[i-1] + f[i-2]; return f[n]; } long fibonaccil_2(int n)//只是相对来说节省了空间的开销 效率相对会低下些 { long pre1 = 1,pre2 = 1,i ,f=0; if (n==1||n ==2) return 1; for(i =3; i <= n;i ++) { f = pre1+ pre2; pre1 = f; pre2 = pre1; } return f; } long fibonaccil_digui(int n)// { if (n==1||n ==2) return 1; else return fibonaccil_digui(n-1) + fibonaccil_digui(n-2); } long finonaccil_memery_digui(long f[],int n)//将已经生成的 记录下来 防止重复计算 { long num = 0; if(f[n]!= -1) return f[n]; if(n==1||n==2) return 1; else { num = finonaccil_memery_digui(f,n-2); num += finonaccil_memery_digui(f,n-1); //num = finonaccil_memery_digui(f,n-1) + finonaccil_memery_digui(f,n-2); } f[n]= num; return num; } long fibonaccil_memery(int n)//记录已经产生的 { int i ; for(i = 3;i <= n; i ++)//为什么从二开始呢 因为前面两个是可以直接得出的 f[i] = -1; return finonaccil_memery_digui(f,n); } void print_fibonaccil(int n) { int i ; for(i = 1; i <=n;i ++) printf("%d ",f[i]); puts("/n"); } int main() { fibonaccil_memery(N-1); printf("%ld",fibonaccil_digui(N-1)); print_fibonaccil(N-1); return 0; } 对于