【问题标题】:Can't understand this Tree recursion problem无法理解这个树递归问题
【发布时间】:2020-01-31 01:33:53
【问题描述】:

所以我正在浏览 SICP 书。我在树递归章节。我用谷歌搜索树递归以获得更多关于它的知识,我偶然发现了这个练习,我很难完全理解它。

练习:

我想上一段有 n 级台阶的楼梯。我每次可以走 1 或 2 步。我可以通过多少种不同的方式上这个楼梯?

答案是:

例如在nis 5的情况下,有8种可能的方式:

1 1 1 1 1

2 1 1 1

1 2 1 1

1 1 2 1

1 1 1 2

1 2 2

2 1 2

2 2 1

这是我无法完全理解的代码块:

(define (count-stairs n)
  (cond [(= n 1) 1]
        [(= n 2) 2]
        [else (+ (count-stairs (- n 1))
                 (count-stairs (- n 2)) ]) ))

说明过程的图片

我的问题是,为什么会有 + 号? count-stairs(4) + count-stairs(3) 不是 7 个步骤吗?或者我在这里遗漏了一些东西

另外:这是练习的完整链接https://berkeley-cs61as.github.io/textbook/tree-recursion.html

请需要你的帮助!

【问题讨论】:

  • count(3) = count(2) + count(1) 即 3. 和 count(4) = count(3) + count(2) 即 5 . 但 count(5) = count(4) + count(3) 即 8。如果问题是采取 1,2,3 步,那么等式将是 count(n-1) + count(n-2) + count(n-3)

标签: recursion lisp binary-tree sicp


【解决方案1】:

树形图只是给出了以(count-stairs 5) 开头的函数调用及其参数的空间。当我们调用带有参数5的函数时,由于表达式(count-stairs (- n 1)),它将调用(count-stairs 4),由于表达式(count-stairs (- n 2)),它将调用(count-stairs 3)。当然,这些值与+ 相加,成为调用的返回值。树只是不显示返回值信息,只显示调用参数。

(count-stairs 5) 的意思不是“数五个楼梯”,而是“调用带有参数5count-stairs 函数来计算上5 楼梯有多少种不同的方式”。

对于(count-stairs 3),结果将为3,因为(count-stairs 1)(count-stairs 2) 分别返回12

但是,(count-stairs 4) 添加了(count-stairs 3)(count-stairs 2),因此(count-stairs 4) -> 5

我们可以使用这个箭头符号来用它们的结果值来注释树中的表达式,从底部开始向上工作。在树的顶部,我们最终会得到(count-stairs 5) -> 8

count-stairs 只是伪装的递归斐波那契函数的一个轻微变体。

为什么这会计算使用 1 或 2 个大小的台阶上楼梯的方式数?首先,基本情况明确。如果楼梯只有一步,那么只有一种方法可以穿过它:我们走那一步。所以(count-stairs 1) -> 1。如果有两个步骤,那么有两种方法:一步一步走,或者一步一步走。因此(count-stairs 2) -> 2。然后是棘手的归纳部分。如果我们面临三个或更多的楼梯,解决办法是什么?

如果我们面对一个有 n 个台阶,n > 2 的楼梯,那么对于如何开始攀爬,我们有两种可能性。可能性(1):我们可以走一步,然后爬剩下的n-1级楼梯;或者,可能性(2)我们可以单步走两步,然后爬上剩下的 n - 2 步楼梯。因此,爬 n 步的方法数是这两种可能性的方法之和:爬 n - 1 步的方法数,加上爬 n - 2 步的方法数。

【讨论】:

  • 非常感谢! :) 是的,它是斐波那契的轻微变化。实际上,我确实在谷歌上搜索了定义,因为我不了解 SICP 中的斐波那契练习:D!
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 2021-04-08
  • 2020-03-26
  • 2014-01-28
  • 1970-01-01
  • 2022-07-04
  • 1970-01-01
  • 2016-08-07
相关资源
最近更新 更多