2、爬楼梯 编代码

题目描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

方法分析:

这道题主要是要明白该爬楼梯的规律其实就是符合斐波那契数列(Fibonacci Sequence) 规律的,问题就迎刃而解了。为什么说它是斐波那契数列呢?我们可以这样来思考:当我们从第 n-1 阶楼梯爬到第 n 阶楼梯时,需要1步;当我们从第 n-2 阶楼梯爬到第 n 阶楼梯时,需要2步.也就是说 到达第 n 阶楼梯的方法数等于到达第 n-1 阶楼梯的方法数加上到达第 n-2 阶楼梯的方法数,其正好符合斐波那契通项。

1、采用递归实现

var climbStairs = function(n) {
    if(n == 1) return 1;
    if(n == 2) return 2;
    return climbStairs(n-1) + climbStairs(n-2);
};

递归是求解斐波那契数列最经典和最直接的方式,其简洁易懂;但是递归特别费时,在该题中使用会出现[超出时间限制]的错误提示。

2、数组方式

var climbStairs = function(n) {
    let result = [1,2];
    for (let i = 2; i < n; i++) {
        result.push(result[i-1] + result[i-2]);
    }
    return result[n-1];
};

数组方式大大的减少了运行时间,我们先预设好前两项,再得到结果,返回数组最后一项即可。
3、ES6的方式

var climbStairs = function(n) {
    let a = b = 1;
    for (let i = 0; i < n; i++) {
        [a, b] = [b, a + b];
    }
    return a;
};

其中 [a, b] = [b, a + b] 表示解构赋值,其等价于

temp = a;
a = b;
b = temp + b;

方法测速:

两种方法速度,数组快很多。
在这里插入图片描述
测速代码:

    console.time()
    var climbStairs = function (n) {
        let result = [1, 2];
        for (let i = 2; i < n; i++) {
            result.push(result[i - 1] + result[i - 2]);
        }
        return result[n - 1];
    };
    console.log(climbStairs(500),'数组');
    console.timeEnd();


    console.time()
    var climbStairs = function (n) {
        let a = b = 1;
        for (let i = 0; i < n; i++) {
            [a, b] = [b, a + b];
        }
        return a;
    };
    console.log(climbStairs(500),'ES6');
    console.timeEnd();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在JavaScript中,创建一个2D游戏人物爬楼梯代码通常会涉及到游戏循环(game loop)、键盘事件监听和游戏对象的移动。以下是一个简单的示例,使用HTML5 Canvas作为渲染平台: ```javascript // 创建游戏环境 const canvas = document.getElementById("gameCanvas"); const ctx = canvas.getContext("2d"); let player = { x: canvas.width / 2, y: canvas.height - 30, speed: 5 }; function drawPlayer() { ctx.fillStyle = "blue"; ctx.fillRect(player.x, player.y, 30, 30); } function handleKeyDown(event) { switch (event.key) { case "ArrowUp": player.y -= player.speed; break; case "ArrowDown": player.y += player.speed; break; // 添加其他方向键处理 } } function gameLoop() { drawPlayer(); checkCollision(); // 检查玩家是否撞到楼梯或地面 requestAnimationFrame(gameLoop); // 每帧调用自身 } document.addEventListener("keydown", handleKeyDown); gameLoop(); ``` 在这个示例中,我们首先获取画布元素和绘图上下文。`player`对象存储了角色的位置和速度。`drawPlayer`函数用于绘制玩家,`handleKeyDown`函数监听键盘输入并更新角色位置。`gameLoop`是游戏的核心循环,每帧都执行绘画和碰撞检测。 为了使这个代码更完整,你需要实现`checkCollision`函数,检查角色是否碰到了楼梯或者墙壁。这可能涉及对楼梯的几何形状和边界进行计算。此外,你可能还需要定义楼梯的位置和移动规则,以及可能的角色动画(如爬楼梯时的动作效果)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值