斐波那契数列(剑指offer)
原文链接:
斐波那契数列的递归算法与非递归算法
以下皆为转载。
一、斐波那契数列
由于斐波纳挈数列是以兔子的繁殖引入的,因此也叫“兔子数列”。它指的是这样一个数列: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)相关推荐
- 剑指 Offer 10- I. 斐波那契数列/剑指 Offer 10- II. 青蛙跳台阶问题
2020-07-02 1.题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少 ...
- [剑指Offer]斐波那契数列、跳台阶、兔子数量问题(递归、非递归)(Java)
剑指Offer题目 斐波那契数列 题目描述 [剑指Offer 7]大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). [剑指Offer 8]一只青蛙 ...
- Lintcode--3(366)--斐波那契数列
题目:查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数 ...
- 查找斐波纳契数列中第 N 个数
所谓的斐波纳契数列是指:前两个数是0和1,第i个数是第i-1个数和第i-2个数的和. eg:斐波纳契数列的钱10 个数是指{0,1,1,2,3,5,8,13,21,34.,,,,,} 一般求解斐波纳契 ...
- C语言实现斐波那契数列。
#斐波那契数列,指的是这样一个数列:1.1.2.3.5.8.13.--它有如下特点:第一,第二项为 1,从第三项开始,每一项为前两项数之和,即: F1 = 1 (n = 1) F2 = 1 (n =2 ...
- 7-112 斐波那契数列 (10 分)
7-112 斐波那契数列 (10 分) (java题解) pta_java题解 题目 斐波那契数列是指这样的一个数列:1,1,2,3,5,8,13,21,-,这个数列从第3个数开始每个数都等于前两个数 ...
- 366. 斐波纳契数列
提示 LintCode中的相关算法题实现代码,可以在我的GitHub中下载. 题目需求 描述 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 ...
- PTA 7-169 斐波那契数列
PTA 7-169 斐波那契数列 分数 10 作者 wjl 单位 赤峰学院 斐波那契数列是指这样的一个数列:1,1,2,3,5,8,13,21,-,这个数列从第3个数开始每个数都等于前两个数的和,请输 ...
- lintcode斐波那契数列
描述:查找斐波纳契数列中第 N 个数 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2, ...
- 斐波那契数列(递归和非递归算法)
一.斐波那契数列介绍: 斐波那契数列,又称黄金分割数列.斐波那契数列是指这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,98 ...
最新文章
- 变步长龙格库塔法matlab代码,matlab 龙格库塔法 变步长龙格库塔法.doc
- Android应用程序键盘(Keyboard)消息处理机制分析(20)
- ASP.NET Core使用Jaeger实现分布式追踪
- paip.svn服务服务器安装配置
- 广告机CE认证 FCC认证费用构成
- 论文格式问题解决,标题前的黑点去除,分页后产生的空格消除。
- 快速开发项目的前端框架主要针对后台界面
- david lowe 论文_访谈:L. Lee Lowe-博客小说家
- outlook图片显示红叉
- 消息队列 RocketMQ应用场景之削峰填谷
- 《小窗幽记》卷六 集景
- IOS 判断iPhone刘海屏
- java实现如何定时给微信群中发送消息
- apache SSI
- Android安卓系统提示应用程序未安装的解决方法
- ExtAspNet v3.1.3
- fire温度压力测试软件,3Dmark
- .idea文件夹如何取消版本控制
- 短链是什么原理?怎么实现呢?
- 计算机组成原理多级中断实验,TEC-XP计算机组成原理实验系统概述
热门文章
- 为什么计算机报名无法选择福建,2020年9月福建计算机考试如何报名
- k8s部署jenkins
- html mysql 数据列表_html的列表加载数据库
- java 判断 继承接口_java基础-接口、继承、多态
- 如何做爬虫python在线观看_Python爬虫实战:利用scrapy,短短50行代码下载整站短视频...
- 电脑的基础知识_电脑计算机网络基础知识
- python读取图像属性并显示_图像读取和显示(Python实现),Opencv,基础,之
- splice方法_JavaScript数组_数组方法【一】(二十六)
- SQL:postgresql中为查询结果增加一个自增序列之ROW_NUMBER 	() OVER ()的使用
- java mybatis 代码生成器_mybatis自动生成java代码