求斐波那契数列的第n项值——9

写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:

0            n = 0

F(n) =  1            n = 1

F(n-1)+F(n-2)    n > 1

也就是斐波那契数列为{0,1,1,2,3,5,8,13,21,......F(n-1)+F(n-2)};

首先可以想到,因为要求第n个斐波那契数,就需要知道第n-1和第n-2个斐波那契数,而求第n-1个斐波那契数就需要知道第n-2个和第n-3个斐波那契数,第n-2个斐波那契数就需要知道第n-3和第n-4个斐波那契数......这样的话,可以用递归来实现:

#include <iostream>
using namespace std;

long long Fib(size_t n)
{
    if(n < 2)
        return n;
    else
        return Fib(n-1)+Fib(n-2);
}

int main()
{
    size_t n = 18; 
    long long ret = Fib(n);
    cout<<"Fibonacci number of "<<n<<" is: "<<ret<<endl;
    return 0;
}

运行程序可得结果:

可以看到第18个斐波那契数为2584,这种情况下是没什么问题的,但如果将n的值再设大一点的话,比如38,或者48、58,就会发现半天运算不出来结果,这是因为递归会有栈的开销,而一个稍微大点的n就会连续压十几个甚至好几十个栈,这样的话,系统的运算效率就大大降低了,因此,用递归来计算斐波那契数并不是最高效的解法。

递归是不断地压栈释放栈,在每一块开辟出来的栈中保存有n个斐波那契数,那么,除了用递归,也可以用数组来依次存储从0到n个斐波那契数,用循环来代替栈的开销,代码可如下:

long long Fib(size_t n)
{
    if(n < 2)     //当n小于2的时候就可以直接返回效率高,就不必再开辟释放空间了
        return n;

    long long *p = new long long[n+1];//因为n相当于下标,存在第0个斐波那契数,因此要开辟n+1的大小
    p[0] = 0;
    p[1] = 1;

    for(size_t i = 2; i <= n; ++i)//循环控制条件下标为n的值才是要返回的值
    {
        p[i] = p[i-1] + p[i-2];
    }
    long long ret = p[n];
    delete[] p;//记得释放空间,否则会有内存泄露
    return ret;
}

运行上面的程序,会发现无论n为多大结果很快就能够得出来,这样的运行效率是比递归压栈要高的多的;

可是,上面的程序还是存在问题,因为如果n的值比较大的话,开辟的空间也会很大,但是我们会发现,要求第n个斐波那契数,只需要知道它前面的两个数然后相加起来就可以了,也就是说,明明只需要三个数据的空间用来存放数据就好了却要开辟出很大的一块空间来将n前面所有的数据都给存放起来,因此,上面的程序虽然比递归压栈效率要高,但是却比较浪费存储空间;上面的代码还是可以优化为如下的:

long long Fib(size_t n)
{
    if(n < 2)
        return n;

    long long f0, f1, f2; //定义三个变量
    f0 = 0;
    f1 = 1;

    for(size_t i = 2; i <= n; ++i)
    {   
        f2 = f0 + f1; //每一次都用三个变量来回交换,因为要求n只需要知道前面两个数就可以了
        f0 = f1; 
        f1 = f2; 
    }   
    return f2; 
}

《完》

时间: 2024-12-27 08:32:20

求斐波那契数列的第n项值——9的相关文章

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)

写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include<stdio.h> int fibonacci(int n) { int num1=1, num2=1, num3=0,i; if (n <= 2) { printf("斐波拉契数列的第%d项为:%d\n",n,num1); } else { for (i = 2; i <

求斐波那契数列的相邻两项的比值,精确到小数后三位。

未完成,只能假设知道是9和10代入. 代码如下: package zuoye; import java.math.BigDecimal; /* * 求斐波那契数列的相邻两项的比值,精确到小数后三位. * p1,p2,p3......pi,pj,...求pi/pj * 1 1 2 3 5 8 13 * 5/8,8/13,...收敛 */ public class Test { static double feibo(int x){ if(x==1||x==2) return 1; return f

[发布] 矩阵乘法及其对于编程求斐波那契数列的某一项的应用

需要PDF的读者可以向我索要. 如果发现有翻印与用于商业用途,将予追究. ======================================= 编者注:本文中如果没有特殊说明,除法均只取整数部分,忽略小数部分. 感谢大家对我的支持!同时感谢ysy大聚聚.

黑马入学基础测试(三)求斐波那契数列第n项,n&lt;30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

.获得用户的输入 计算      3打印就行了.   这里用到了java.util.Scanner   具体API  我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复读取 自己写的代码: package com.itheima; import java.util.Scanner; public class Test3 { /** * 3.求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55 * * @author

01-封装函数求斐波那契数列第n项

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <script> //需求:封装一个函数,求斐波那契数列的第n项 alert(getValue()); //定义一个函数 function getValue(n){ //回顾

快速求斐波那契数列(矩阵乘法+快速幂)

斐波那契数列 给你一个n:f(n)=f(n-1)+f(n-2) 请求出 f(f(n)),由于结果很大请 对答案 mod 10^9+7; 1<=n<=10^100; 用矩阵乘法+快速幂求斐波那契数列是经典应用: 矩阵公式 C i j=C i k *C k j; 根据递推式 构造2*2矩阵: 原始矩阵 1 0 0 1 矩阵 2 1 1 1 0 原始矩阵与矩阵 2相乘达到转化状态效果: 对矩阵二进行快速幂 乘法:达到快速转化矩阵的效果: 即使达到快速转化状态:那么大的数据范围也很难求解: 高精?这有

求斐波那契数列的第n个数(递归、非递归)

用递归的方式求斐波那契数列的第n个数. 用非递归的方式求斐波那契数列的第n个数. 定义: 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368 特别指出:第0项是0,第1项是第一个1. 这个数列从第2项开始,每一项都等于前两项之和. #include<stdio.h> #include<stdlib.

利用矩阵求斐波那契数列

利用矩阵求斐波那契数列 flyfish 2015-8-27 矩阵(matrix)定义 一个m*n的矩阵是一个由m行n列元素排成的矩形阵列.矩阵里的元素可以是数字符号或者数学式. 形如 {acbd} 的数表称为二阶矩阵,它由二行二列组成,其中a,b,c,d称为这个矩阵的元素. 形如 {x1x2} 的有序对称为列向量Column vector 设 A={acbd} X={x1x2} 则 Y={ax1+bx2cx1+dx2} 称为二阶矩阵A与平面向量X的乘积,记为AX=Y 斐波那契(Fibonacci