【剑指Offer】斐波那契数列及其延伸问题——JavaScript实现
2017-12-01 13:55
405 查看
斐波那契数列问题
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。分析
斐波那契数列是这样一个数列,第1项、第2项都为1,后面每项是前两项之和:1,1,2,3,5,8,13,21,34...,即f(n)=f(n-1)+f(n-2)。这个问题用递归解决的话,核心代码只需两行,但是放在OJ上跑,可能AC不了,因为其中存在大量子问题重复计算的情况。我在OJ上试了一下,递归耗时是非递归的10倍以上,当然n越大,倍数也会越大的,《剑指Offer》指出,时间复杂度是以n的指数的方式递增的。所以下面用非递归实现:
function Fibonacci(n)//n是下标 { if(n === 0)return 0; if(n <= 2)return 1; var first = 1,second = 1; var result; for(var i=3;i<=n;i++){ result = first + second; first = second; second = result; } return result; }这段代码一开始我并没有添加第3行,结果死活AC不了,该OJ应该是认为:第0项是0,第1项是1,第2项是前两项之和,即为1,以此类推。。。总之逻辑没变。
跳台阶问题
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析
跳上n级台阶的跳法可认为f(n),第一次跳的时候有两种选择,一是第一次只跳1级,那么整个跳法就是剩下的n-1级台阶的跳法,及f(n-1);二是第一次跳2级,那么整个跳法就是剩下的n-2级台阶的跳法,及f(n-2)。所以整个n级台阶的跳法
f(n)=f(n-1)+f(n-2),这么一看,就成了斐波那契数列了。代码如下:
function jumpFloor(number) { var first = 1,second = 2; var result; if(number === 1)return first; if(number === 2)return second; for(var i=3;i<=number;i++){ result = first + second; first = second; second = result; } return result; }
变态跳台阶问题
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析
按照上面跳台阶问题的分析可推出,f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(1)+f(0),其中f(0)表示,第一次直接跳了n级,剩下0级台阶的跳法即为f(0),不难看出,f(0)=1。同理f(1)=1。
而f(n-1)= f(n-2)+f(n-3)+...+f(1)+f(0),所以,f(n)=2f(n-1)。所以代码如下:
function jumpFloorII(number) { // write code here if(number <= 1)return 1; return 2 * jumpFloorII(number - 1); }上面代码虽然虽然是递归,但是不存在子问题重复计算的情况,因此AC该没问题。
相关文章推荐
- 剑指offer:有时间限制 实现斐波那契数列
- 剑指offer----斐波那契数列的实现--递归和迭代
- 剑指offer-算法题练习:part10 矩形覆盖-斐波那契数列问题
- 【剑指Offer】JS实现 斐波那契数列
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- 【剑指Offer】旋转数组的最小元素——JavaScript实现
- 剑指offer-算法题练习:part8 跳台阶-斐波那契数列问题
- 剑指offer面试题9-青蛙跳台阶及其变种问题
- 【剑指offer——JAVA实现】斐波那契数列
- 剑指offer JavaScript实现
- 剑指offer--面试题9:斐波那契数列--Java实现
- 剑指offer面试题9-斐波那契数列问题
- 剑指offer——大数相乘问题(BigInteger的大致实现思路)
- 【剑指Offer】重建二叉树——JavaScript实现
- 剑指offer-算法题练习:part7 斐波那契数列-斐波那契数列问题
- 剑指offer——斐波那契数列相关问题总结
- 剑指offer——斐波那契数列多种方法实现
- 剑指offer面试题9 斐波那契数列及青蛙跳台阶问题
- 剑指offer编程题——09 斐波那契数列以及相关问题
- 剑指Offer之斐波那契数列问题