原文链接:
斐波那契数列的递归算法与非递归算法


以下皆为转载。

一、斐波那契数列

由于斐波纳挈数列是以兔子的繁殖引入的,因此也叫“兔子数列”。它指的是这样一个数列:0,1,1,2,3,5,8,13……从这组数可以很明显看出这样一个规律:从第三个数开始,后边一个数一定是在其之前两个数的和。在数学上,斐波纳挈数列可以以这样的公式表示:
F(0) = 0
F(1) = 1,
F(n) = F(n-1) + F(n-2),(n>=2)


1。递归算法:

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

方法二:

//作者:结晶的冰
//链接:https://www.nowcoder.com/questionTerminal/c6c7742f5ba7442aada113136ddea0c3
//来源:牛客网int Fibonacci(int n) {if(n==0)return 0;else if(n==1||n==2)return 1;else if(n==3)return 2;elsereturn 3*Fibonacci(n-3)+2*Fibonacci(n-4);}

这样的递归算法虽然只有简单的几行,但是效率却很低。为什么呢?我们可以分析其递归调用的时间复杂度:
时间复杂度 —– O(2^N)。

2。非递归算法:

所以,如果在时间复杂度和空间复杂度都有要求的话,我们可以用以下两种非递归算法来实现:

1):时间复杂度为O(N),空间复杂度为O(N)

创建一个数组,每次将前两个数相加后直接赋给后一个数。这样的话,有N个数就创建一个包含N个数的一维数组,所以空间复杂度为O(N);由于只需从头向尾遍历一边,时间复杂度为O(N)。


long long* Fib2(long long num)
{assert(num >= 0);//非递归long long* array = new long long[num+1];array[0] = 0;array[1] = 1;for (int i=2; i<=num; i++){array[i] = array[i-1] + array[i-2];}return array;
}

2)时间复杂度为O(N),空间复杂度为O(1)

借助两个变量 first 和 second ,每次将 first 和 second 相加后赋给 third ,再将 second 赋给 first ,third 赋给 second,如此循环。

#include<iostream>
#include<vector>using namespace std;int Fibonacci(int num)
{if(num==0)return 0;if(num==1)return 1;int first = 0;int second = 1;int third;for(int i=2; i<=num; i++){third = first + second;first = second;second = third;}return third;
}int main()
{cout<<Fibonacci(39)<<endl;system("pause");return 0;}

运行结果为:

63245986
请按任意键继续. . .

斐波那契数列(剑指offer)相关推荐

  1. 剑指 Offer 10- I. 斐波那契数列/剑指 Offer 10- II. 青蛙跳台阶问题

    2020-07-02 1.题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少 ...

  2. [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)

    剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...

  3. Lintcode--3(366)--斐波那契数列

    题目:查找斐波纳契数列中第 N 个数.           所谓的斐波纳契数列是指:           前2个数是 0 和 1 .           第 i 个数是第 i-1 个数和第i-2 个数 ...

  4. 查找斐波纳契数列中第 N 个数

    所谓的斐波纳契数列是指:前两个数是0和1,第i个数是第i-1个数和第i-2个数的和. eg:斐波纳契数列的钱10 个数是指{0,1,1,2,3,5,8,13,21,34.,,,,,} 一般求解斐波纳契 ...

  5. C语言实现斐波那契数列。

    #斐波那契数列,指的是这样一个数列:1.1.2.3.5.8.13.--它有如下特点:第一,第二项为 1,从第三项开始,每一项为前两项数之和,即: F1 = 1 (n = 1) F2 = 1 (n =2 ...

  6. 7-112 斐波那契数列 (10 分)

    7-112 斐波那契数列 (10 分) (java题解) pta_java题解 题目 斐波那契数列是指这样的一个数列:1,1,2,3,5,8,13,21,-,这个数列从第3个数开始每个数都等于前两个数 ...

  7. 366. 斐波纳契数列

    提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载. 题目需求 描述 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第  ...

  8. PTA 7-169 斐波那契数列

    PTA 7-169 斐波那契数列 分数 10 作者 wjl 单位 赤峰学院 斐波那契数列是指这样的一个数列:1,1,2,3,5,8,13,21,-,这个数列从第3个数开始每个数都等于前两个数的和,请输 ...

  9. lintcode斐波那契数列

    描述:查找斐波纳契数列中第 N 个数 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, ...

  10. 斐波那契数列(递归和非递归算法)

    一.斐波那契数列介绍: 斐波那契数列,又称黄金分割数列.斐波那契数列是指这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,98 ...

最新文章

  1. 变步长龙格库塔法matlab代码,matlab 龙格库塔法 变步长龙格库塔法.doc
  2. Android应用程序键盘(Keyboard)消息处理机制分析(20)
  3. ASP.NET Core使用Jaeger实现分布式追踪
  4. paip.svn服务服务器安装配置
  5. 广告机CE认证 FCC认证费用构成
  6. 论文格式问题解决,标题前的黑点去除,分页后产生的空格消除。
  7. 快速开发项目的前端框架主要针对后台界面
  8. david lowe 论文_访谈:L. Lee Lowe-博客小说家
  9. outlook图片显示红叉
  10. 消息队列 RocketMQ应用场景之削峰填谷
  11. 《小窗幽记》卷六 集景
  12. IOS 判断iPhone刘海屏
  13. java实现如何定时给微信群中发送消息
  14. apache SSI
  15. Android安卓系统提示应用程序未安装的解决方法
  16. ExtAspNet v3.1.3
  17. fire温度压力测试软件,3Dmark
  18. .idea文件夹如何取消版本控制
  19. 短链是什么原理?怎么实现呢?
  20. 计算机组成原理多级中断实验,TEC-XP计算机组成原理实验系统概述

热门文章

  1. 为什么计算机报名无法选择福建,2020年9月福建计算机考试如何报名
  2. k8s部署jenkins
  3. html mysql 数据列表_html的列表加载数据库
  4. java 判断 继承接口_java基础-接口、继承、多态
  5. 如何做爬虫python在线观看_Python爬虫实战:利用scrapy,短短50行代码下载整站短视频...
  6. 电脑的基础知识_电脑计算机网络基础知识
  7. python读取图像属性并显示_图像读取和显示(Python实现),Opencv,基础,之
  8. splice方法_JavaScript数组_数组方法【一】(二十六)
  9. SQL:postgresql中为查询结果增加一个自增序列之ROW_NUMBER () OVER ()的使用
  10. java mybatis 代码生成器_mybatis自动生成java代码