【剑指Offer】斐波那契数列及其延伸问题——JavaScript实现

来源:互联网 发布:linux 最新内核 编辑:程序博客网 时间:2024/06/08 19:04

斐波那契数列问题

题目描述

大家都知道斐波那契数列,现在要求输入一个整数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该没问题。


原创粉丝点击