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 }
浙公网安备 33010602011771号