C Fibonacci前n项和

本文详细介绍了斐波那契数列的递归和非递归实现方式,包括求某一项值、求前n项和,并通过代码实例展示了如何实现。此外,还探讨了一个特殊的数列求和,其分子和分母均为斐波那契数列的一部分,通过代码实现并计算了该数列的前20项和。
#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;

}

 

转载于:https://www.cnblogs.com/cart55free99/archive/2013/03/21/2973198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值