#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;
}