青蛙跳台阶

题目:一直青蛙,一次可以跳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 @ 2025-02-26 14:54  yangkangkang  阅读(50)  评论(0)    收藏  举报