题目1:写一个函数,输入n,其斐波那契数列的第n项。

斐波那契数列的定义如下:

方法1:使用递归解,时间复杂度是n的指数级别

斐波那契数列的定义就是递归的,我们根据定义可以很简单的写出代码。代码如下:

View Code

#include<iostream>
#include<stdlib.h>
using namespace std;//f(n)={0,1,1,2,3...} n>=0int Fibonacci(int n)
{if(n<=0)return 0;if(n==1)return 1;return Fibonacci(n-1)+Fibonacci(n-2);
}void main()
{int f=Fibonacci(30);cout<<f<<endl;system("pause");
}

但是这样的方法存在明显的不足,该方法的时间复杂度是n的指数级别,随着n的增大,运算时间不可想象,比如说f(50)就要很久。时间复杂度之所以这么大,是因此计算过程中存在着重复计算。以f(10)为例,f(10)=f(9)+f(8),f(9)=f(8)+f(7)。其中的f(8)就是重复计算的。

方法2:开辟一个长度为(n+1)的数组,时间复杂度为O(n),空间复杂度为O(n)

前面我们计算斐波那契数列是从后往前计算的,就是计算f(n)=f(n-1)+f(n-2),然后再递归计算f(n-1),又是从后往前计算,就是因为这样的从后往前计算,所以才会有很多的重复计算。那么我们可以逆转思路,考虑从前往后计算。比如我们要计算f(4),那么我们就计算f(0)、f(1)、f(2)、f(3),将这些计算出来的值保存在一个数组arry[n+1]上,这样计算斐波那契数列就相当于是一个填表的过程。时间复杂度大大降低。代码实例如下:

View Code

int Fibonacci(int n)
{if(n<=0)return 0;else if(n==1)return 1;else{//动态创建一个长度为(n+1)的数组int *arry=new int[n+1];arry[0]=0;arry[1]=1;for(int i=2;i<=n;i++){arry[i]=arry[i-1]+arry[i-2];}int result=arry[n];//因为动态创建的数组不会因为出了作用域,内存就会被释放。//动态分配的数组将一直存在,直到程序显示释放它为止,因此这里使用delete []//c++提供delete []表达式释放指针所指向的数组空间。
        delete [] arry;return result;}
}

注意点:

  1. 因为不知道要求的f(n)中的n有多大,因此不能事先开辟一个数组,需要动态创建数组。而动态数组与数组变量不同,动态分配的数组将一直存在,直到程序显式释放它为止。普通的数组变量,只要出了数组的作用于,其内存会自动释放。
  2. c++提供delete []表达式释放指针所指向的数组空间。delete [] arry;该语句回收了arry所指向的数组,把相应的内存返回给自由存储区。在关键字delete和指针arry之间的方括号[]是必不可少的:它告诉编译器该指针指向的是自由存储区中的数组,而非单个对象。delete arry只释放了arry指针所指向的内存地址,理论上来说会少释放了内存空间,从而产生内存泄露。

方法3:优化方法2,空间复杂度为O(1),时间复杂度为O(n)

在方法2中,我们保存了每一个中间变量,但是仔细观察我们可以发现没有必要保存每一个中间变量,我们只需要保存两个临时变量即可完成斐波那契数列的计算。具体代码试下如下:

View Code

int Fibonacci(int n)
{if(n<=0)return 0;else if(n==1)return 1;else{//当n>=2时,初始化pre=f(0)=0,post=f(1)=1,f(n)=0;int pre=0;int post=1;int fn=0;//采用循环计算斐波那契数列,通过两个临时变量pre和post保存中间结果,避免重复计算for(int i=2;i<=n;i++){fn=pre+post;//fn等于其前面两个元素值的和//然后让pre和post分别直线他们后面的元素。pre=post;post=fn;}return fn;}
}

题目2:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。

这道题目的本质就是斐波那契数列。假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,f(1)=1;如果有两个台阶,那么有两种跳法,第一种跳法是一次跳一级,第二种跳法是一次跳两级,f(2)=2。如果有大于2级的n级台阶,那么假如第一次跳一级台阶,剩下还有n-1级台阶,有f(n-1)种跳法,假如第一次条2级台阶,剩下n-2级台阶,有f(n-2)种跳法。这就表示f(n)=f(n-1)+f(n-2)。将上面的斐波那契数列代码稍微改一下就是本题的答案。这列略之。

题目3:我们可以用2X1(2行1列)的小矩形横着或者竖着去覆盖更大的矩形。请问用8个2X1的小矩形无重复地覆盖一个2X8的大矩形,总共有多少种方法。

               
               
 
 

这道题目还是斐波那契数列的变种。设f(8)表示覆盖2X8大矩形的方法综述。假设第一个小矩形是竖着去覆盖大矩形,那么还剩下由7个2X1的小矩形组成的大矩形f(7);假设第一个小矩形是横着去覆盖大矩形,那么还剩下由6个2X1的小矩形组成的大矩形f(6)。即f(8)=f(7)+f(6)。依此类推,最后f(1)=1,f(2)=2。使用计算斐波那契数列的方法计算这道题目即可求出答案。

转载于:https://www.cnblogs.com/xwdreamer/archive/2012/05/15/2501606.html

面试题9:斐波那契数列相关推荐

  1. 剑指Offer - 面试题10- I. 斐波那契数列

    文章目录 1. 题目 2. DP解题 3. 面试题 08.01. 三步问题 4. LeetCode 509. 斐波那契数 1. 题目 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 ...

  2. 面试题 (斐波那契数列,复杂度为线性)

    来自网易的一道看似简单的笔试题 题目:要求以线性时间复杂度实现斐波那契数列. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...... 众所周知的斐波那契实现方式为递归 ...

  3. 剑指offer:面试题10- I. 斐波那契数列

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...

  4. python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法

    Q10.斐波那契数列 题目描述 写一个函数,输入n,求斐波那契数列的第n项. 解题思路 思路一 递归 递归很简单但是并不能AC python实现代码 class Solution: def Fibon ...

  5. 剑指offer面试题10- I. 斐波那契数列

    题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: 思路 详见链接 代码 class Solution:def fib(self,n:int) ...

  6. 【博客搬家旧文】剑指offer [ java ] 面试题10 斐波那契数列

    契波那契数列最常见的解法,递归如下: public class Solution {public int Fibonacci(int n) {if(n == 0)return 0;else if(n ...

  7. 剑指 offer 面试题精选图解 10-I.斐波那契数列

    大家好,我是程序员吴师兄,欢迎来到图解剑指 Offer 专栏,在这个专栏里我将和大家一起学习如何用合理的思维来思考.解题.写代码. 今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 ...

  8. 剑指offer——面试题10:斐波那契数列

    个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...

  9. fibonacci数列前20项_面试题精选:神奇的斐波那契数列

    斐波那契数列,其最开始的几项是0.1.1.2.3.5.8.13.21.34-- ,后面的每一项是前两项之和,事实上,斐波那契在数学上有自己的严格递归定义. f0 = 0 f1 = 1 f(n) = f ...

  10. [剑指offer]面试题9:斐波那契数列

    面试题9:斐波那契数列 题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: ❖ 效率很低的解法,挑剔的面试官不会喜欢 代码如下: long long f ...

最新文章

  1. 网络运维工程师心法:6 大技能让你告别背锅
  2. 模型参数优化(三):模拟退火
  3. 大剑无锋之内存泄漏是什么?【面试推荐】
  4. SQL Server 2008中的代码安全(四):主密钥
  5. php中解析数组,在PHP中解析多维数组
  6. Win7下OpenCV3.2.0+VS2015配置
  7. python wordpress建站_WordPress快速建站
  8. 蓝湖完成 10 亿元 C+ 轮融资,发布一站式产品设计协作工具
  9. 单元素的枚举类型已经成为实现Singleton的最佳方法
  10. 数字基带信号功率谱理论研究和实验仿真【含有MATLAB仿真实验以及实验报告】
  11. matlab振荡环节相频特性,自动控制原理第五章频率特性)汇总.ppt
  12. 超简单的子父组件传值
  13. 谷歌google浏览器升级后发生个人资料错误 发送反馈解决方法
  14. Java-微信授权and手机号授权
  15. python 抓取上交所、深交所互动版块的投资者提问(散户评论)
  16. 最优传输论文(二十六):Sliced Wasserstein Discrepancy for Unsupervised Domain Adaptation论文原理
  17. 国外计算机课程lab,计算机系统实验之bomblab
  18. 微信小程序Day2学习笔记
  19. python3中的 eval函数
  20. 【Matlab学习手记】sym8小波滤波

热门文章

  1. python打开摄像头cmd_Python调用shell cmd方法代码示例解析
  2. 不重复点名抽奖_抽奖新玩法?和平精英蜘蛛异变套装上线 参与十次可获得所有奖励...
  3. Linux3种进程,linux内核获取进程的全路径3种方法
  4. 24点游戏python编程代码和运行结果_编程实现24点游戏,我发现自己总是输是有原因的...
  5. 解决VsCode中C程序无法键盘输入的问题
  6. JavaScript学习笔记:数组
  7. Python学习笔记:创建进程
  8. 【BZOJ1079】【codevs2428】着色方案,DP
  9. 2017.5 期中考试 完挂
  10. Pentium 4处理器架构/微架构/流水线 (7) - NetBurst前端详解 - 分支预测