剑指offer-面试题9.斐波拉契数列
题目一:写一个函数,输入n,求斐波拉契数列的第n项。
斐波拉契数列的定义如下:
{ n=;
f(n)={ n=;
{ f(n-)+f(n-) n>;
斐波拉契问题很明显我们会想到用递归来解决:
long long Fibonacci(unsigned int n)
{
if(n==)
return ;
if(n==)
return ; if(n>)
return Fibonacci(n-)+Fibonacci(n-);
}
这道题用递归解决思路很清晰,代码很简单,那么问题来了
根据马克思辩证主义思想,往往简单的思路会带来较大的
时间空间开销。在这种递归计算的过程中往往会计算很多
重复的项,比如计算f(6)时就需要计算f(5),f(4),计算f(5)时
会计算f(4),f(3)然而f(4)在之前计算f(6)的过程中就已经计算
过了。看似这不会带来很大的开销,但是我们这样想一想
斐波拉契中的每个数的计算都由两个数组成,然而这两个数
中就有一个是已重复计算了,相当于计算时间增加了1倍,效率
降低了一倍。
下面我们用非递归解法来解这道题:
#include <iostream>
using namespace std; long Fibonacci(unsigned int n)
{
long int answer[]={,};
if(n<)
return answer[n]; long int nums2=;
long int nums1=;
long int ans=; for(int i=;i<=n;i++)
{
ans=nums2+nums1;
nums1=nums2;
nums2=ans;
}
return ans;
} int main()
{
unsigned int data;
cout<<"Input the n: ";
cin>>data; cout<<"The answer is: "<<Fibonacci(data)<<endl;
return ;
}
运行截图:

当然剑指Offer一书还提到了另外两种方法:
1.由于在计算的时候有重复项,那么我们可以保存计算的中间项,当计算的时候如果找到
已经计算的重复项则不必重复计算
2.另外一种方法是时间复杂度为logn的方法,这种方法具体可以参考剑指offer一书。
剑指offer-面试题9.斐波拉契数列的更多相关文章
- 【剑指offer】9、斐波拉契数列
面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long ...
- 剑指Offer - 九度1387 - 斐波那契数列
剑指Offer - 九度1387 - 斐波那契数列2013-11-24 03:08 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.斐波那契数列的定义如下: ...
- 【剑指offer】7:斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1).假设 n≤39 解题思路: 斐波拉契数列:1,1,2,3,5,8--,总结 ...
- 剑指offer第二版-10.斐波那契数列
面试题10:斐波那契数列 题目要求: 求斐波那契数列的第n项的值.f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2) n>1 思路:使用循环从下往上计算数列. 考点:考察对递归 ...
- 剑指offer【07】- 斐波那契数列(java)
题目:斐波那契数列 考点:递归和循环 题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39. 法一:递归法,不过递归比较慢, ...
- 剑指offer(7)斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...
- 【剑指Offer】7、斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).假设n<=39. 解题思路: 斐波那契数列:0,1,1,2,3, ...
- 剑指offer——矩阵覆盖(斐波那契变形)
****感觉都可以针对斐波那契写一个变形题目的集合了****** 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? cl ...
- 【剑指offer】面试题 10. 斐波那契数列
面试题 10. 斐波那契数列 题目一:求斐波那契数列的第n项 题目描述:求斐波拉契数列的第n项 写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项.斐波拉契数列定义如下: C++ 实现 ...
随机推荐
- Java异常的使用
1.exception的分类 java将异常分为两种,checked exception和unchecked exception(一般指runtimeException). checked excep ...
- Maximum Subarray / Best Time To Buy And Sell Stock 与 prefixNum
这两个系列的题目其实是同一套题,可以互相转换. 首先我们定义一个数组: prefixSum (前序和数组) Given nums: [1, 2, -2, 3] prefixSum: [0, 1, 3, ...
- UVA1218--树形DP
没有看书和题解做的一道树形DP题,思路很清晰..只是debug上花了很久的时间才发现看错了条件..并不是每个点都只能和一台服务器相邻,而是非服务器的点只能和一台服务器相邻..看错了一个条件差距大了去了 ...
- windows任务栏消失
windows任务栏消失,快捷键打开任务管理器,新建任务explorer.exe
- spring3 jsp页面使用<form:form modelAttribute="xxxx" action="xxxx">报错,附连接数据库的spring MVC annotation 案例
在写一个使用spring3 的form标签的例子时,一直报错,错误信息为:java.lang.IllegalStateException: Neither BindingResult nor plai ...
- c++之 printf 打印内容
该代码全部在Visual Studio 2015中编写,有关VS2015的安装流程后期在写相关的博文 首先让我们来输出一下hello, world! 1.首先新建一个main.cpp的文件,然后在该文 ...
- 多线程下不反复读取SQL Server 表的数据
在进行一些如发送短信.邮件的业务时,我们常常会使用一个表来存储待发送的数据,由后台多个线程不断的从表中读取待发送的数据进行发送.发送完毕后再将数据转移到历史表中,这样保证待发送表的数据普通情况下不会太 ...
- .NET(C#):分析IL中的if-else,while和for语句并用Emit实现
这是一篇关于IL和反射Emit的文章(所以不喜欢IL或者Emit的就没必要往下看了),要求读者对IL和Emit工作原理较了解.所有分析IL均在Visual Studio 2010 SP1下编译生成.( ...
- ios打包应用程序,生成ipa文件
假设我的程序调试好了,怎么才干发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,可是我们没有证书,这样输出会产生错误. 以下教你怎样生成ipa文件: 1.到你当前proje ...
- [Python学习笔记][第五章Python函数设计与使用]
2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...