#include <stdio.h> #include <stdlib.h> #include <string.h> //Fibonacci非递归 int fibonnaci1(int n);//求某一项的值 int fibonnaci2(int n);//求某一项的值 long sumFi(int n);//求前n项的和 //递归法求前n项和 实际上是将结果都放在一个数组中 然后对该数组求和 int arr[20]={0,0,0,0,0}; long putToArrayFi2(int n); long sumFi2(int n); double fenmu[21]; double fenzi[21]; double sumME(int n); int main() { printf("%d\n", fibonnaci2(5)); printf("%d\n", fibonnaci1(5)); printf("%ld\n",sumFi(5));//长整型数据 ld 记住是拉登 printf("%d\n",putToArrayFi2(5)); printf("%ld\n",sumFi2(5)); //接下来求一个特殊数列 // 2/1 + 3/2 + 5/3 + 8/5 + 13/8 ... //仔细观察 发现分子分母都是Fibonacci数列 一个从2 3开始 另一个从 1 2 开始 printf("%lf",sumME(20)); return 1; } int fibonnaci2(int n) { if (n == 1 || n == 2) { return 1; } else { return fibonnaci2(n - 1) + fibonnaci2(n - 2); } } int fibonnaci1(int n){ int t1=1; int t2=1; int t3=0; int i=3; for(i=3;i<=n;i++){ t3=t1+t2; t1=t2; t2=t3; } return t3; } //求前n项和的时候用非递归比较方便 long sumFi(int n){ long sum=2; int t3=0; int t1=1; int t2=1; if(n==1){ return 1; }else if(n==2){ return 2; } int i=3; for(i=3;i<=n;i++){ t3=t1+t2;//当前项是t3 他是前两项的和 sum+=t3; t1=t2;//重新赋值前两项 为下一项求值做准备 //当然 我还可以把求出的每一项都放在数组中 t2=t3; } return sum; } long putToArrayFi2(int n){ if (n == 1 ) { arr[n]=1; } else if(n==2){ arr[1]=1; arr[2]=1; }else { arr[n]=putToArrayFi2(n-1)+putToArrayFi2(n-2); } return arr[n]; } long sumFi2(int n){ long sum=0; int i=1; for(;i<=n;i++){ sum=sum+arr[i]; } return sum; } double sumME(int n){ fenzi[1]=2; fenmu[1]=1; fenzi[2]=3; fenmu[2]=2; int i=3; for(;i<=n;i++){ fenzi[i]=fenzi[i-1]+fenzi[i-2]; fenmu[i]=fenmu[i-1]+fenmu[i-2]; } double sum=0; for(i=1;i<=n;i++){ //printf("--%lf--",fenzi[i]/fenmu[i]); sum+=fenzi[i]/fenmu[i]; } return sum; }