楼梯递归

2023-12-04

我试图理解一本书中提供的以下问题的解决方案:

“一个孩子正在跑上有 n 级台阶的楼梯,并且一次可以跳 1 级、2 级或 3 级。实现一种方法来计算孩子可以跑上楼梯的可能方式。”

书中的解决方案如下,源于“最后一步可能是从n - 1开始的单步跳跃,从步骤n - 2开始的双步跳跃或从步骤n - 3开始的三步跳跃”

public static int countWaysDP(int n, int[] map) {
    if (n < 0) 
        return 0;
    else if (n == 0)
        return 1;
    else if (map[n] > -1)
        return map[n];
    else {
        map[n] = countWaysDP(n - 1, map) + countWaysDP(n - 2, map) + countWaysDP(n - 3, map);
        return map[n]; }
}

我的困惑是:

  1. 如果步数为零,为什么程序要返回 1?我的想法是,如果步数为零,那么穿过楼梯的方式就有零种。难道不是更好的解决方案是“if (n

  2. 我不确定我是否理解将其设为静态方法背后的基本原理? Google 表示静态方法是由整个类调用的方法,而不是由类的对象调用的方法。所以这本书的意图似乎是这样的:

.

class Staircase {
    static int n;
public:
    static int countWaysDP(int n, int[] map); }

代替:

class Staircase {
    int n;
public:
    int countWaysDP(int n, int[] map); }

为什么?类实例化多个楼梯有什么问题?

Thanks.

(注:本书正在破解编码面试)


回答你的第一个问题,这就是数学之美:如果楼梯有 1 级台阶,就有 1 种解决方法。如果有0步,还有1种解决方法,就是什么都不做。

就好像,对于一个n级楼梯,m次,你可以走1、2或3级台阶来完成它。因此,如果 n 为 1,则 m 为 1,并且有 1 种方式。如果n为0,m为0,还有一种方法——根本不采取任何步骤。

如果你写出两级楼梯的所有路径,那就是[[1, 1], [2]],对于 1 级楼梯,它是[[1]],对于 0 楼梯,它是[[]], not []。数组内部元素的数量[[]]是 1,不是 0。

如果问题是您可以走 1 步或 2 步,这将成为斐波那契数列。请注意,fib(0) = 1 和 fib(1) = 1,它对应于同一件事:当楼梯为 1 步时,有 1 种解决方法。当有 0 个步骤时,有 1 种方法可以解决,那就是什么都不做。事实证明,走两级楼梯的方式数 fib(2) 是 2,它等于 fib(1) + fib(0) = 1 + 1 = 2,如果 fib( 0) 等于 0。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

楼梯递归 的相关文章

  • 第99章 啤酒瓶递归好像不行

    好的 这是我在学习过程中编写的简单代码 void SingTheSong int NumOfBottles if NumOfBottles 0 printf there are simply no more bottles of beer
  • 递归替换多维数组中特定键每次出现的值

    我有一个数组 其数组深度可能会有所不同 例如 array one gt array array something gt value array something2 gt value2 another gt anothervalue tw
  • 递归方法比交互式方法慢 10 倍 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 代码已尽可
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 使用一次递归调用实现递归

    给定一个函数如下 f n f n 1 f n 3 f n 4 f 0 1 f 1 2 f 2 3 f 3 4 我知道使用递归来实现它 并在一个函数内进行三个递归调用 但我想在函数内仅使用一次递归调用来完成此操作 怎样才能做到呢 要实现使用
  • 在堆栈已满并给出分段错误之前,C/C++ 中的最大递归函数调用次数?

    我正在做一个问题 我使用递归函数来创建线段树 对于较大的值 它开始出现分段错误 所以我之前认为可能是因为数组索引值越界 但后来我认为这可能是因为程序堆栈太大 我编写这段代码是为了计算系统出现段错误之前允许的最大递归调用次数 include
  • MySQL 最佳实践:SELECT 子递归尽可能提高性能?

    我想选择一个根项目及其子项 使其性能尽可能高 我更喜欢使用嵌套集模型 但这次表结构遵循邻接模型 有关嵌套集和邻接模型的更多信息 http mikehillyer com articles managing hierarchical data
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 如何用流程图表示递归函数?

    我需要在流程图上表示递归函数 我的问题是我不知道如何指示该函数可以一次在多个元素上调用自身 例如扫描图形的函数 有人有什么建议吗 在流程图中 您通常不会为循环之类的内容添加多次调用 您只需指示可以重复调用代码 直到满足条件为止 因此 对于递
  • 为什么Racket中foldl的定义方式很奇怪?

    在 Haskell 中 与许多其他函数式语言一样 函数foldl被定义为 例如 foldl 0 1 2 3 4 10 这没关系 因为foldl 0 1 2 3 4 根据定义 0 1 2 3 4 但是 在 球拍 中 foldl 0 1 2 3
  • Javascript - deepEqual 比较

    问题 来自 Eloquent Javascript 第二版 第 4 章 练习 4 编写一个函数 deepEqual 它接受两个值 并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象 其值也是 与对 deepEqual 的递归
  • Python最大递归,关于sys.setrecursionlimit()的问题

    我有一个问题sys setrecursionlimit 来自蟒蛇docs https docs python org 2 library sys html sys setrecursionlimit这个函数 将Python解释器堆栈的最大深
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • 函数速度测试的奇怪结果

    我编写了一个使用递归来查找最大公因数 分母 的函数 gt gcd function a b if length a length b gt 1 warning Only scalars allowed using first element
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • 包装一个采用 std::function 的函数,以便传递采用更多参数的函数

    Problem 我有一个函数double subs std function
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • 有没有相互递归的例子?

    是否有递归函数调用另一个函数 该函数也调用第一个函数 的示例 例子 function1 do something function2 do something function2 do something function1 do some
  • 重新安装后使用 pandas dataframes 时出现问题

    我已经重新安装了 Python 和 Anaconda 现在面临以下问题 在我将 pkl 文件加载到数据帧并尝试 查看 该文件后 如下所示 df pd read pickle example pkl df 我收到错误 AttributeErr
  • 动态规划的复杂组合条件

    我正在探索动态规划设计方法如何与问题的底层组合属性相关 为此 我正在查看的规范实例硬币找零问题 Let S d 1 d 2 d m and n gt 0是请求的金额 我们可以用多少种方式相加n仅使用中的元素S 如果我们遵循一个动态规划如果要

随机推荐

  • 通过 CSS 调整 BUTTON 的大小

    我使用 jquery mobile 生成按钮 下面有一个 CSS 代码来更改其设计 但无论我在宽度和高度中输入什么值 按钮的大小都不会改变 但它相对依赖于字体大小标签 如何更改此设置 以便无论标签的字体大小如何都可以更改按钮大小 ui 1
  • 在 Java 中使用 MongoDB 中的日期范围进行查询

    我是 MongoDB 的新手 我里面装满了收据 例如 一张收据看起来像这样 id oid 510fa057c6f818c2bfd0b279 StoreName Metro StoreNumber 521 Items ItemName Bat
  • 您不能将自定义标题与其他标题功能结合起来

    在我的应用程序中 我使用 ActionBarSherlock 库 我还使用自定义标题栏 这是我的 onCreate requestWindowFeature Window FEATURE CUSTOM TITLE setContentVie
  • 从父母到孩子该选择什么类型的演员?

    这个问题是关于哪个C 风格转换应该用来进行这种转换 我知道 C 风格的强制转换可以实现这一点 对于以下class结构 class Foo class Bar public Foo 说我被给予 Foo ptr 我想把它投射到Bar 我应该使用
  • 虚函数和模板冲突

    我有一个 pointAccumulator 的抽象基类 这个抽象基础将填充方法 例如返回所有点的平均值的函数 这两个类的示例如下所示 class lala public virtual someFunctions 0 virtual boo
  • ggplotly 因 geom_vline() 和 xintercept 日期值而失败

    尝试使用ggplotly用垂直线绘制时间序列数据以指示感兴趣的日期 呼叫失败并显示Ops Date z xy 86400000 中的错误 未为 Date 对象定义 我尝试使用最新的 CRAN 和 ggplot2 的开发版本 根据plotly
  • 在 React Native 应用程序中加载片段

    我正在开发我的 Android 库和 ReactNative 之间的桥梁 以便能够在混合应用程序上使用我的库 我首先创建了一个基本应用程序react native init其中有默认的 Android 和 iOS 文件夹 然后我导入了我的库
  • 我的 Fortran 95 随机数生成器有什么问题吗?

    这是一个随机数生成器模块 我用它与我的主程序一起编译 此处未列出 当我尝试编译随机数生成器模块以查看其是否有效时 我收到以下消息 第 61 行 调用 random seed put Seed 错误 random seed 内在函数的 put
  • ggExtra 绘图格式:不同绘图维度的相似边缘图

    这个问题涉及使用 ggplot2 ggExtra 生成的格式化图 与任何错误无关 require ggplot2 gt Loading required package ggplot2 require ggExtra gt Loading
  • 为什么 boost::any 不保存字符串文字?

    include
  • 用于分割字符串的复杂正则表达式

    我需要一些关于正则表达式难题的帮助 我仍在掌握这一切 显然不是专家 例如 假设我有一个复杂的字符串 如下所示 something here examp le foo bar BLAH something else here and here
  • 如何在 Javascript 中获取重复数组的最后一次出现位置

    我有一个包含重复项的数组 nameList name name1 filename filename1 name name2 filename filename2 name name3 filename filename2 我只想保留唯一的
  • 在 Python Tkinter 模块中检测按钮按下

    我在 python tkinter 中检测 检查按钮按下时遇到问题 我有一个变量click我希望如果我的按钮被点击那么它就会变成 True 例如 这是我的代码 buttonClicked False myButton Button 我想要这
  • 如何记录 ARCamera 随着时间的推移的位置和旋转并将其保存到文件中?

    我已经尝试创建一个 ARView 两天多了 它可以随时间记录相机在空间中的位置 然后将其保存到关键帧文件中 基本上 我想创建一个应用程序 让您记录虚拟相机的运动 然后可以在 3D 应用程序中使用 例如Autodesk Maya or Cin
  • ISO 8601 Date JS 解释差异 - IE/FF 与 Chrome

    为什么 IE FF 和 Chrome 需要 JavaScript 引擎解释方式不同 this 日期格式 YYYY MM DDTHH mm ss fff 没有时区指示符 new Date 2015 02 18T15 43 57 803 get
  • WPF 如何创建具有验证和绑定的自定义文本框

    我正在开发一个用于货币编辑的自定义文本框 我见过一些现成的 但它们很复杂和 或并不真正可用 迫使您采取不良做法 例如对应该在控件上使用的名称进行硬编码 因此 我决定自己完成此操作 但在使用绑定选项时遇到了麻烦 因为分配给绑定属性的属性必须是
  • 使用 Python SDK 进行数据流流式传输:将 PubSub 消息转换为 BigQuery 输出

    我正在尝试使用数据流读取 pubsub 消息并将其写入大查询 我获得了 Google 团队的 alpha 访问权限 并且已经使提供的示例正常工作 但现在我需要将其应用到我的场景中 发布订阅有效负载 Message data datetime
  • 处理滤镜和颜色

    我想制作如图所示的过滤器here 这些是我的目标过滤器 但您能指导我如何实现它们吗 我怎样才能制作这样的过滤器 我需要遵循哪些算法 作为初学者我需要采取哪一步 这是获取 RGB 值和滤镜阴影的更好 最简单的方法 copy of image
  • 如何在 swift 中使用 tableview 重新排序 Realm 表

    我想使用 Realm 作为数据源 在 swift 的表格视图中重新排序我的收藏夹列表 以下代码可以工作 但是它会创建两次收藏夹列表 我正在努力删除数据 以便能够以正确的顺序重新加载收藏夹 这是代码 MARK REORDER list ove
  • 楼梯递归

    我试图理解一本书中提供的以下问题的解决方案 一个孩子正在跑上有 n 级台阶的楼梯 并且一次可以跳 1 级 2 级或 3 级 实现一种方法来计算孩子可以跑上楼梯的可能方式 书中的解决方案如下 源于 最后一步可能是从n 1开始的单步跳跃 从步骤