青蛙跳台阶

题目:一直青蛙,一次可以跳1个台阶,也可以跳2个台阶,问该青蛙跳上n级台阶,总共需要多少种方式

分析:

  • f(1) = 1 跳 1级台阶只有一种方式
  • f(2) = 2 跳 2级台阶,有两种方式
  • f(n) = f(n-1) + f(n-2) 跳n级,可拆分成两个问题
    • 第一次跳,要么跳1级,要么跳2级
    • 第一次跳1级,剩下f(n-1) 种方式
    • 第一次跳2级,剩下 f(n-2) 种方式  
  • 看公式,和斐波那契数列一样。
  • 这是典型的动态规划问题:即把一个大问题,拆分成不同的小问题,递归乡下
  • 类似这种问题,我们一般使用动态规划的思路(递归)分析问题,再转化为循环来解决问题

代码实现(循环方式实现):

  斐波那契数列的时候我们知道,不能用递归方式实现,所以我们采用循环的方式

复制代码
/**
 * @description 青蛙跳台阶问题
 */

/**
 * 
 * @param n 
 * @returns 
 */
export function jumpFloors(n: number): number{
    if(n <= 1) return 1 //  如果台阶小于等于1返回1 
    let a = 1 // 记录 跳n-2 台阶的方法数量
    let b = 1 // 记录 跳 n-1 台阶的方法数量
    let res = 1 
    for(let i = 2; i <= n; i++){
        res = a + b;
        a = b;
        b = res
    }
    return res
}
复制代码

 

测试用例:

复制代码
/**
 * @description 青蛙跳台阶问题 测试
 */
import {jumpFloors} from './jumpFloors'

describe('青蛙跳台阶问题 测试',()=>{
    it('小于等于1个台阶的情况',()=>{
        expect(jumpFloors(-1)).toBe(1)
        expect(jumpFloors(0)).toBe(1)
        expect(jumpFloors(1)).toBe(1)
    })
    it('正常情况',()=>{
        expect(jumpFloors(3)).toBe(3)
        expect(jumpFloors(4)).toBe(5)
        expect(jumpFloors(5)).toBe(8)
    })
})
复制代码

 

 

 

 

posted @   yangkangkang  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
历史上的今天:
2023-02-26 js相关面试题总结
点击右上角即可分享
微信分享提示