斐波那契数列

来源:互联网 发布:windows 8 apart from 编辑:程序博客网 时间:2024/06/05 02:37


《编程之美》学习实践,这里要会推导Fibonacci的封闭形式。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//1.按照斐波那契的定义容易用递归实现
int fibonacci( int n){
    if(n <= 0){ //看具体数学说负数也有对应的 Fibonacci
        return 0;
    } else if (n == 1){
        return 1;
    } else{
        return fibonacci(n -1) + fibonacci(n - 2);
    }
}

//2.在知道问题规模不是很大的时候可以静态构建查询表
//免得每次都会重复进行很多递归计算,用空间换时间
int fibonacci2( int n){
    int ftab[] = {0,1,1,2,3,5,8,13,21,34,55};
    if(n >= 0 && n <= 10){ //查表
        return ftab[n];
    } else{
        return fibonacci2(n - 1) + fibonacci2(n - 2);
    }
}

//3.通过数学推导来发现 Fibonacci的封闭形式
//当然这里引入了无理数,会有精度的损失
double fibonacci3( int n){
    return sqrt(5)/5.0 * (pow((1 + sqrt(5)) / 2.0 , n) - pow((1 - sqrt(5)) / 2.0 , n));
}



int main()
{
    int n = 10;
    //printf("F(%d) = %d\n", n, fibonacci(n)); //0.125s
    //printf("F(%d) = %d\n", n, fibonacci2(n)); //0.119s
    printf( "F(%d) = %f\n", n, fibonacci3(n)); //0.067

    return 0;
}
0 0
原创粉丝点击