剑指Offer面试题:7.斐波那契数列

一题目:斐波那契数列二效率很低的解法很多C/C++/C#/Java语言教科书在讲述递归函数的时候,大多都会用Fibonacci作为例子,因此我们会对这种解法烂熟于心上述递归的解法有很严重的效

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:斐波那契数列

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


剑指Offer面试题:7.斐波那契数列

二 效率很低的解法

  很多C/C++/C#/Java语言教科书在讲述递归函数的时候,大多都会用Fibonacci作为例子,因此我们会对这种解法烂熟于心

#include "stdio.h"
#include <iostream>
using namespace std;

int Fibs(int n)
{
    if (0 == n)
    {
        return 0;
    }
    else if (1 == n)
    {
        return 1;
    }
   return Fibs(n-1) + Fibs(n-2);
}

void main()
{
    cout << "斐波那契数列:" << endl;
    cout <<Fibs(0)<<" ";
    cout <<Fibs(1)<<" ";
    cout <<Fibs(2)<<" ";
    cout <<Fibs(3)<<" ";
    cout <<Fibs(4)<<" ";
    cout <<Fibs(5)<<" ";
    cout <<Fibs(6)<<" ";
    cout <<Fibs(7)<<" ";
    cout <<Fibs(8)<<" " << endl;
    return;
}

剑指Offer面试题:7.斐波那契数列

  上述递归的解法有很严重的效率问题,通过求解第10项的调用过程图来分析:

  剑指Offer面试题:7.斐波那契数列

  从上图中不难发现:在这棵树中有很多结点是重复的,而且重复的结点数会随着n的增大而急剧增加,这意味计算量会随着n的增大而急剧增大。事实上,用递归方法计算的时间复杂度是以n的指数的方式递增的

三 时间复杂度为O(n)的解法

  改进的方法并不复杂。上述递归代码之所以慢是因为重复的计算太多,我们只要想办法避免重复计算就行了。这里的办法是从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……依此类推就可以算出第n项了。很容易理解,这种思路的时间复杂度是O(n)

#include "stdio.h"
#include <iostream>
using namespace std;

int Fibs(int n)
{
    int nFibs = 0;
    if (0 == n)
    {
        return 0;
    }
    else if(1 == n)
    {
        return 1;
    }
    int nSubOne = 1;  // Fibs(n-1)
    int nSubTwo = 0;  // Fibs(n-2)
    for (int i = 2; i <= n; i ++)
    {
        nFibs = nSubOne + nSubTwo;
        nSubTwo = nSubOne;
        nSubOne = nFibs;
    }

    return nFibs;
}

void main()
{
    cout << "斐波那契数列:" << endl;
    cout <<Fibs(0)<<" ";
    cout <<Fibs(1)<<" ";
    cout <<Fibs(2)<<" ";
    cout <<Fibs(3)<<" ";
    cout <<Fibs(4)<<" ";
    cout <<Fibs(5)<<" ";
    cout <<Fibs(6)<<" ";
    cout <<Fibs(7)<<" ";
    cout <<Fibs(8)<<" " << endl;
    return;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120168.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月19日 上午11:00
下一篇 2021年12月19日 下午12:00


相关推荐

  • 谷歌搜索技巧(1)

    谷歌搜索技巧(1)1 site 对搜索的网站进行限制

    2026年3月26日
    4
  • 信不信十分钟让你彻底搞懂java反射[通俗易懂]

    信不信十分钟让你彻底搞懂java反射[通俗易懂]自从搞懂java反射,我是越来越觉得这破公司容不下我了

    2022年7月26日
    8
  • 两位数相乘的速算法靠谱吗?

    两位数相乘的速算法靠谱吗?我们有了常规的知识体系,更多时候会感觉繁琐,或者感觉力不从心,所以我们就会有投机的心理,一旦发现存在一些相关的攻略,看起来可能会颠覆原本的认知,我们就会更加欣喜。比如前几天我无意中看到了下面的速算攻略。我直接拿来原文。…

    2022年6月7日
    48
  • 根据经纬度和半径计算经纬度范围

    根据经纬度和半径计算经纬度范围nbsp nbsp paramraidus 单位米 nbsp nbsp returnminLat minLng maxLat maxLng nbsp nbsp nbsp publicstatic getAround doublelat doublelon intraidus nbsp nbsp nbsp Doublelatitu lat nbsp nbsp nbsp Doublelo

    2025年8月10日
    6
  • 10个常用的3D建模软件,作为3D建模的软件东西很杂很碎,还需多练习才最重要「建议收藏」

    10个常用的3D建模软件,作为3D建模的软件东西很杂很碎,还需多练习才最重要「建议收藏」很多人都会好奇,电脑是怎么将手绘的2D图形变成3D的实际物品的?究竟是什么神奇魔法能够瞬间将我们的想法变成现实的呢?今天来和大家介绍下工业设计师经常会用到的10个3D建模软件。SolidworksSolidworks是工业设计师经常会用到的一款建模软件。SolidWorks是一款在MircosoftWindows上才能运行的建模计算机辅助设计和计算机辅助工程的计算机程序,由DassaultSystemes开发和发布。这是一款很常见的很普遍的工业设计建模软件,如果你以后有机会在国外找工

    2022年5月12日
    77
  • vs 序列号密钥「建议收藏」

    vs 序列号密钥「建议收藏」2003序列号: D64GG-GXY6T-V6FTR-WCPBB-2YDYB T7KXG-78HXC-JYRF8-72VH2-6DM7M2005序列号: KGR3T-F2C26-RRTGT-D6DQT-QBBB32008序列号: XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT WPX3J-BXC3W-BPYWP-PJ8CM-F7M8T2013序列号: BWG7X-J98B3-W34RT-33B3R-JVYW92015序列号:专业版:HMGNV-WCYXV-X7G9W-YCX6

    2022年5月24日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号