【JS算法】斐波那契的时间空间trade-off

时间戳裂痕
• 阅读 1243

题目描述

  1. 共有n个台阶,每次只能上1个台阶或者2个台阶,共有多少种方法爬完台阶?
  2. 共有n页书,每次只能翻1页或者2页书,有多少种方法翻完全书?
  3. 形如1,1, 2, 3, 5, 8, 13, 21, 34, 55的数列,后一位是前面两位相加(斐波那契数列),写出函数要求找到第N位是多少,如:fib(3) => 3,fib(5) => 8,要求时间复杂度为O(n)。[更改前两位就可以]

题目难度:⭐

  • 100个台阶 需要f(100) = f(99)+f(98)
  • 典型的f(n)=f(n-1)+f(n-2)问题
// 方法一:递归
// 时间复杂度F(n) = F(n-1) + F(n-2) =>O(2^n)
function f1(n){
    if(!typeof n ==="number"){
        throw "n is not a number!";
    }
    if ( n===0 || n===1 ){  
        return 1  
    }  else {
        return f(n-1) + f(n-2)  
    }
}
/*------------------------------------------------*/
// 方法二 用一个数组把计算过的结果存一遍
// 线性时间复杂度 O(n) 
function f2(n){
    let ary = new Array(n)
    ary[0] = 1; 
    ary[1] = 1; 
    for (let i=2;i<n+1;i++){  //注意这里一定不是长度 
        ary[i]=ary[i-1]+ary[i-2] 
    }  
    return ary[n];
}

// 方法2.1 结合ES6的数组解构
function Fib(n) {
    let a =1 ,b =1;
    let arr = [a,b]
    while (arr.length < n+1) {
        [a,b] = [b,a+b]; //es6的解构
        arr.push(b);
    }
    return arr[n];
}

/*------------------------------------------------*/
// 方法三 递归 用对象保存结果
// 两个函数
// 线性时间复杂度 O(n) 
var cache = {};
function f3(n){
    if(!(n in cache)){
        cache[n] = _fib(n)
    }   
    return cache[n]
}
    
function _fib(n){
    if(n===0||n===1){
        return 1
    } else {
        return f3(n-1)+f3(n-2)
    }
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java基础编程练习题
1、題目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?123456711235813这就是斐波那契数列(Fibonaccisequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Le
CuterCorley CuterCorley
4年前
C语言基础习题50例(三)11-15
你们看出神马了吗(\\^_\^\)习题11有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少实现思路:从第1个月起,兔子对数分别为1、1、2、3、5、8、13、21...,显然是斐波拉契数列。代码如下:cinclude<stdio.hintmai
Wesley13 Wesley13
3年前
Java面试不得不知的程序(二)
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?斐波那契数列:前面相邻两项之和,构成了后一项通项公式注:此时a11,a21,ana(n1)a(n2)(n3,n∈N\)通项公式的推导斐波那契数列:1、1
Stella981 Stella981
3年前
Python递归函数、匿名函数、过滤函数
递归函数Python对递归的深度有限制,超过即会报错。所以一定一要注意跳出条件。斐波拉契数列一个数列,第一个数是1,第二个数也是1,从第三个数开始,每一个数是前两个数之和公式:f(1)1,f(2)1,f(3)f(1)f(2),...,f(n)f(n2)f(n1)
Wesley13 Wesley13
3年前
JAVA学习入门篇_递归结构
递归结构递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”,一个使用递归技术的方法将会直接或者间接的调用自己。​利用递归可以用简单的程序来解决一些复杂的问题。比如:斐波那契数列的计算、汉诺塔、快排等问题。​递归结构包括两个部分:​1.定义递归头。解答:什么
贾蔷 贾蔷
1个月前
洛谷P1255题 解题思路和步骤 C++实现带注释,c++入门基础题
一、问题描述与递推关系建立洛谷P1255数楼梯问题要求计算n级台阶的不同走法数,每次可以跨1级或2级。这本质上是斐波那契数列的变种问题,递推公式为f(n)f(n1)f(n2)。当n≤50时可用普通整型存储,但题目中n可能达到5000,这就必须使用高精度运
贾蔷 贾蔷
1小时前
【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路
一、题目解读‌是一个经典的数学问题,在计算机科学中常被用作教学的入门案例。这个神奇的数列从0和1开始,后续每个数字都是前两个数字之和。题目要求我们计算第n个,看似简单的问题背后却蕴含着重要的算法思想。当n较小时,这个问题似乎微不足道,但随着n的增大,不同的
菜园前端 菜园前端
2年前
什么是动态规划?
原文链接:什么是动态规划?动态规划也是算法设计的一种方法/思想。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原来的问题。基础案例场景一斐波那契数列当前数等于前面两个数的和。定义子问题:f(n)f(n1)f(n2)
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
贾蔷 贾蔷
1个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们
贾蔷 贾蔷
1个月前
力扣746:三步通关最小花费爬楼梯
题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值costi,之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点。要求找出到达顶部的‌最小花费路径‌。例如输入cost
时间戳裂痕
时间戳裂痕
Lv1
道理只会告诉你对错但未必能给你幸福.
文章
2
粉丝
0
获赞
0