JS 剑指Offer(七) 青蛙跳台阶/斐波那契数

题目:一个青蛙一次可以跳一个或者两个台阶,求青蛙跳上n级台阶的所有方法

方法一:

分析:如果没有了解过斐波那契数列的同学可能对这个题稍有困惑,首先我们可以通过动态规划的思路来解决,不难想到,青蛙跳到某个台阶的方法数量 = 跳到上个台阶的方法数量 + 跳到上上个台阶的方法数量

利用这个简单的公式就可以实现基本的动态规划了,代码如下

 1     var numWays = function(n){
 2       let f = [1,2]
 3       if(n==0||n==1){
 4         return n
 5       }else{
 6         for(let i=2;i<n;i++){
 7           f.push(f[i-1]+f[i-2])
 8         }
 9         return f[n-1]%(1e9+7)
10       }
11     }
12     console.log(numWays(3))

首先到第0台阶和第1台阶的方法数分别是0,1,到第二个台阶的方法数是2

所以这里先建立了一个数组f,到第三个台阶的方法数就是f[0]+f[1],以此类推,到台阶n的方法数就是f[n-1]

注意:大数阶乘,大数的排列组合等,一般都要求将输出结果对1000000007取模(取余),这一点很重要,尤其是结果非常大的时候,可以防止溢出

方法二:

通过方法一我们知道,这种求得最终青蛙跳台阶方法数就是前两个数相加所得,这页恰恰就是斐波那契额数列【0,1,2,3,5,8,13....】

我们可以通过求斐波那契数列直接得到结果

第一种方法是递归,但是这种方法在计算机上求几万以上的数超级慢

1            var fib = function(n){
2                if(n == 0 || n == 1){
3                    return n
4                }else{
5                    return fib(n-1)+fib(n-2)
6                }
7            }

第二种方法其实和方法一中求跳台阶方法一样

1            var fib2 = function(n){
2                let fibonacci = [0,1];
3                for(let i=2;i<=n;i++){
4                    fibonacci[i] = (fibonacci[i-1]+fibonacci[i-2]) % (1e9+7)
5                    //1000000007 是最小的十位质数。模1000000007,可以保证值永远在int的范围内
6                }
7                return fibonacci[n]
8            }

 

posted @ 2020-04-09 11:32  前端攻城狮4536251  阅读(362)  评论(0)    收藏  举报