AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79371937
Accepted
ABGR
ABGR
Asked: 2025-01-21 00:02:52 +0800 CST2025-01-21 00:02:52 +0800 CST 2025-01-21 00:02:52 +0800 CST

通过一次爬一级、两级或三级台阶到达 A 点到 B 点的方法数

  • 772

我正在一个在线平台上解决一个测试,问题陈述与此类似。

Stuart 必须从一个地方到另一个地方(A->B),他每次可以跳 1 步、2 步或 3 步。A 和 B 之间可以有 n 个阻挡器。

我们需要找出他能做到这一点的方法数量。

我觉得这类似于经典的爬楼梯问题,但区别不大,在爬楼梯问题中,你最终必须到达第 n 级台阶,而在这个特定问题中,你必须走下楼梯,这样可能就是第 n+1 级台阶。我说得对吗?

所以我写的代码是这样的:

function countWays(n) {
    
    if (n < 0) return 0;
    if (n === 0) return 1;
    if (n === 1) return 2; //If you have one stop-over, there's two ways to reach. One is take one jump and then one more. Second is take two jumps at once and reach the destination

    return countWays(n-1) + countWays(n-2) + countWays(n-3);
 
}

console.log(countWays(4))

这没有被接受。所以我想知道这有什么问题。我是否也应该添加基本情况n==2?

if (n === 2) return 4

但这仍然没有任何好处,因为n = 3它会返回6,而从视觉上我可以看到,如果有 3 个中途停留,就会有 7 种方式。

我想问的另一个问题是,

在经典的楼梯案例中,基准情况n === 0是 1。这里还是一样吗?这让我有点困惑,因为当没有更多的台阶可以爬的时候,结果怎么会是 1。另一方面,当n === 1你仍然有一条路可以到达目的地时。

此外,f(3)逻辑和直觉表明应该是:

number of ways to reach first stopover + f(2)

而且number of ways to reach first stopover只有一种方式可以做到这一点(跳一次)。

但是,我不能输入if(n == 1) return 1基本情况,因为这样不正确。假设只有一个中途停留点 (n = 1),实际上有两种到达方式:

  1. 跳 2 步
  2. 跳 1 步,然后再跳 1 步。

这也造成了一些混乱。

algorithm
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    trincot
    2025-01-21T00:47:36+08:002025-01-21T00:47:36+08:00

    我觉得这类似于经典的爬楼梯问题……而在这个特定问题中,你必须走下楼梯,这可能需要 n+1 步。我说得对吗?

    是的。

    我是否也应该添加 n==2 的基本情况?

    是的,或者您可以更轻松地添加案例,因为它代表您到达目的地的n == -1情况,并代表可能性 (1)。这看起来很奇怪,但与您之前的观察一致,即这个问题的表述方式与您更习惯的措辞相比有 1 步不同。情况是您超出目的地的情况,因此这就是您想要返回 0 的时候。实际上,除了准确到达( )和超出( )之外,您不需要其他情况。其余的由此得出。n < -1n == -1n < -1

    这是您的修改后的代码:

    function countWays(n) {
        if (n < -1) return 0; // Overshooting: not a possibility.
        if (n === -1) return 1; // Destination reached: this is a possibility and thus counts as one.
        return countWays(n-1) + countWays(n-2) + countWays(n-3);
    }
    
    for (let n = 0; n < 5; n++) {
        console.log(n, countWays(n));
    }

    现在这并不高效,因为对于较大的n,您将一遍又一遍地进行相同的递归调用。您可以使用自下而上的制表法来获得有效的解决方案:

    function countWays(n) {
        let [a, b, c] = [0, 0, 1];
        while (n-- > -1) {
            [a, b, c] = [b, c, a + b + c];
        }
        return c;
    }
    
    for (let n = 0; n < 5; n++) {
        console.log(n, countWays(n));
    }

    • 1

相关问题

  • 找到能够整除数组中整数之间互不差的最小正整数

  • Golang Codewars 中大量测试用例的最后一位失败

  • 编写 LMC 程序来计算用户输入的数字之和。停止前显示总和

  • 如何确定3个水壶问题中的可达状态?

  • 查找从 l 到 r 中按位与等于 0 的自然数对的数量

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve