编程之美之斐波那契数列

【背景】

【思路1-递归】

int Fibonacci(int n){
        if(n <= 2){
            return n;
        }
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }

进一步优化:

当n增大到一定数值,Fibonacci数列值会溢出,并且花费时间很长。

long long Fibonacci(int n){
        if(n <= 2){
            return n;
        }
        return Fibonacci(n - 1) + Fibonacci(n - 2);
    }

【思路2-递推关系式的优化】

long long Fibonacci(int n){
        long long* Fibonacci = (long long*)malloc(sizeof(long long)*(n+1));
        Fibonacci[0] = 0;
        Fibonacci[1] = 1;
        for(int i = 2;i <= n;i++){
            Fibonacci[i] = Fibonacci[i-1] + Fibonacci[i-2];
        }
        return Fibonacci[n];
    }

该思路的另一种实现方法:

long long  Fibonacci(int n){
        int i;
        long long fibonacciA = 0;
        long long fibonacciB = 1;
        long long fibonacciC;
        if(n == 0){
            return 0;
        }
        else if(n == 1){
            return 1;
        }
        for(i = 2;i <= n;i++){
            fibonacciC = fibonacciA + fibonacciB;
            fibonacciA = fibonacciB;
            fibonacciB = fibonacciC;
        }
        return fibonacciC;
    }

【思路3-求解通项公式】

int Fibonacci(int n) {
        double s = sqrt(5);
        // floor 返回小于或者等于指定表达式的最大整数
        return floor((pow((1+s)/2, n) - pow((1-s)/2, n))/s + 0.5);
    }

当n增大到一定数值,Fibonacci数列值会溢出。因为floor返回小于或者等于指定表达式的最大整数

【思路4-分支策略】

#include <iostream>
#include <malloc.h>
#include <stdio.h>
using namespace std;
//矩阵乘法
void MatrixMulti(long long matrix[2][2],long long matrix2[2][2]){
    long long a = matrix[0][0] * matrix2[0][0] +  matrix[0][1] * matrix2[1][0];
    long long b = matrix[0][0] * matrix2[0][1] +  matrix[0][1] * matrix2[1][1];
    long long c = matrix[1][0] * matrix2[0][0] +  matrix[1][1] * matrix2[1][0];
    long long d = matrix[1][0] * matrix2[0][1] +  matrix[1][1] * matrix2[1][1];
    matrix[0][0] = a;
    matrix[0][1] = b;
    matrix[1][0] = c;
    matrix[1][1] = d;
}
//Fibonacci数列
long long Fibonacci(int value){
    if(value == 0){
        return 0;
    }
    long long A[2][2] = {1,1,1,0};
    //初试为单位矩阵
    long long Matrix[2][2] = {1,0,1,0};
    int n = value - 1;
    for(; n ;n >>= 1){
        //奇偶
        if(n&1){
            MatrixMulti(Matrix,A);
        }//if
        MatrixMulti(A,A);
    }//for
    return Matrix[0][0];
}

int main() {
    int i,n,height;
    while(scanf("%d",&n) != EOF){
        long long result;
        for(i = 0;i <= n;i++){
            result = Fibonacci(i);
            printf("%lld\n",result);
        }//for
    }//while
    return 0;
}

该思路另一种解析:

【相关题目】

剑指Offer之斐波那契数列

剑指Offer之跳台阶

剑指Offer之矩形覆盖

LeetCode之Climbing Stairs

时间: 2024-09-30 21:21:16

编程之美之斐波那契数列的相关文章

输出斐波那契数列的算法

斐波那契数列(Fibonacci polynomial),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.-- 要求编程输出这样的一组数,比如输出10个数的序列 /** * @param i 第n个数 * @param j 第n+1个数 * @param n 输出个数 */ public static void ff( int i,int j,int n){ int m=1; System.out.print(i+","); while(m++<n)

斐波那契数列和反向计算问题

反向计算:编写一个函数将一个整型转换为二进制形式 反向计算问题,递归比循环更简单 分析:需要理解,奇数的二进制最后一位是1,偶数的二进制最后一位一定是0,联想记忆,这个和整型的奇偶性是一致的,1本身就是奇数,0本身是偶数.     十进制整数转换为二进制整数采用"除2取余,逆序排列"法. 具体做法是:用2整除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,

猆波那契数列-斐波那契数列求和~~~~~

问题描述 斐波那契数列求和----- 如何用C语言程序求斐波那契数列的前10项和,哪位大牛帮帮忙.还有什么水仙花问题 解决方案 用c++随便写的#include#include #include using namespace std;int main(){ int sum=1; int *a = new int[10]; vectorv; a[0] = 0; a[1] = 1; for (int i = 2; i < 10; i++) { a[i] = a[i - 1] + a[i - 2];

递归解决斐波那契数列

1.什么是递归? 递归:递归是方法定义调用方法本身的现象.递归举例如下: <span style="font-size:14px;">public class DiGuiDemo { //递归方法举例 public void show() { show(); } } </span> 2.递归的注意事项? (1)递归一定要有出口.否则就会死递归. 上面举例用的递归就是一个死递归,方法永远都在进行自身调用,最终一定会陷入内存崩溃.所以递归要定义出口,就是结束递归的条

斐波那契数列 优化矩阵求法实例_C 语言

在做编程题目的时候经常会遇到"斐波那契数列"相关的题目,尤其在做OJ中.下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级. 复制代码 代码如下: long long fac(int n){ if(n==1) return 1; else if(n==2)  return 2; else   return fac(n-1)+fac(n-2);} (二)循环 利用临时变量来保存中间的计算过程,加快运算. 复制代码 代码如下: long long fac(int

斐波那契数列 矩阵求法 优化

在做编程题目的时候经常会遇到"斐波那契数列"相关的题目,尤其在做OJ中.下面说一些方法: (一)递归 递归是最慢的会发生重复计算,时间复杂度成指数级. long long fac(int n) { if(n==1) return 1; else if(n==2) return 2; else return fac(n-1)+fac(n-2); } (二)循环 利用临时变量来保存中间的计算过程,加快运算. long long fac(int n) { long long a=1,b=2,

hdu 4549 M斐波那契数列

click here ~~ Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的值吗? Input 输入包含多组测试数据: 每组数据占一行,包含3个整数a, b, n( 0 <= a, b, n <= 10^9 ) Output 对每组测试数据请输出一个整数F[n],由于F[n]可能很大,你只需输出F[n

用PHP迭代器来实现一个斐波纳契数列

斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解的. <?php /* *@author nicesunboy@gmail.com */ class Fibonacci implements Iterator { private $previous = 1; private $current = 0; private $key = 0; publ

打印菱形以及斐波纳契数列的几种解法介绍

1.编写程序,打印*菱形推出第i行要打印的空白个数及*号个数,用for循环依次打印各行 复制代码 代码如下: #include<stdio.h> //总共要打印2*n-1行,逐行打印 void print1(int n) { int i,j; for(i=1;i<=n;i++){//打印1至n行 for(j=1;j<=n-i;j++)//打印n-i个空格 printf(" "); for(j=1;j<=2*i-1;j++)//打印2*i-1个*号 prin