无法理解此Tree递归问题

时间:2019-10-01 18:10:52

标签: recursion lisp binary-tree sicp

因此,我正在阅读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)) ]) ))

说明过程的图像

enter image description here

我的问题是,为什么会有+号? count-stairs(4)+ count-stairs(3)是7个步骤吗?或者我在这里想念什么

ALSO:这是指向练习https://berkeley-cs61as.github.io/textbook/tree-recursion.html

的完整链接

请需要您的帮助!

1 个答案:

答案 0 :(得分:2)

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

(count-stairs 5)并不意味着“计算五个台阶”,而是“使用参数count-stairs调用5函数以计算有多少种不同的方法可以使{ {1}}楼梯”。

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

但是,2(count-stairs 4)(count-stairs 3)加上(count-stairs 2)

我们可以使用此箭头表示法从底部开始到向上使用其结果值来注释树中的表达式。在树的顶部,我们将以(count-stairs 4) -> 5结尾。

(count-stairs 5) -> 8只是伪装的递归斐波那契函数的微小变化。

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

如果我们面对n阶n> 2的楼梯,那么关于如何开始攀爬有两种可能性。可能性(1):我们可以迈出一步,然后爬上n-1步的剩余楼梯;或者,可能性(2)我们可以单步走两步,然后爬上n-2步的其余阶梯。因此,爬升n步的方式数是这两种可能性的总和:爬升n-1步的方式数,加上爬升n-2步的方式。