我需要在Scheme中的列表中找到叶子。
例如,如果我有(1 (2 3) (4 (5) (7 (8) (10 11 12))))))
,我的叶子为(8)
和(10 11 12)
。所以我的函数将返回(1 (2 3) (4 (5) (7 leaf1 leaf2)))))
。
定义:叶子是可能最深嵌套的元素。
示例:在(1 (2 (3)))
中,元素(3)
是一个叶子。
在((1 2) (3 4))
中,元素(1 2)
和(3 4)
是离开的。
我尝试使用map
函数,该函数将检查列表是否由列表组成。如果是 - 所以我再次调用该函数,如果没有,我打破并将列表更改为叶子的符号。它不起作用。
我被困在它身上2天了。我想找个主意,不是实现。谢谢。
答案 0 :(得分:2)
要想做对,这有点棘手。以下是一些方法的建议:
如上所述,问题是走遍列表,找到不包含任何其他列表的最深层嵌套列表(这些列表有时称为“原子列表”),并用其他内容替换它们。可以在一个递归函数中执行此操作,但我认为将其分解为部分更清晰:
首先,我们需要一个谓词(一个返回布尔值#t
或#f
的函数)来确定列表是否是原子列表。 (有时称为lat?
)。你可以把它写成一个简单的递归函数,或者你可以使用库函数any
和list?
然后我们需要一个函数(define (max-lat-depth lst) ...)
来查找嵌套在其参数中最深层嵌套的原子列表的深度。这将是一个双重递归函数 - 它需要检查每个列表的first
以及rest
中的所有元素。我们可以按如下方式定义max-lat-depth
:
一个。如果参数本身为lat
,则最大深度为零,因此(max-lat-depth '(1 2 3))
== 0
湾如果参数的第一个元素不是列表,则它不会影响整体的最大嵌套深度。因此,在这种情况下,整个参数的max-lat-depth
将与列表的max-lat-depth
(rest
)的cdr
相同:(max-lat-depth '(1 (2 (3 4)))
== (max-lat-depth '((2 (3 4)))
== 2
℃。棘手的情况:如果参数的第一个元素是一个列表(如((1 2) (3 4))
中所述),我们需要重复first
(或car
)和{{1 ({1}}的(或rest
),返回这些值的最大值。但是,在获取最大值之前,我们需要在这两个结果中添加1到1。我会告诉你哪一个以及为什么。
最后,我们编写一个函数cdr
,它将采用从lst
,列表(define (replace-lats-at-depth depth lst r) ...)
和替换max-lat-depth
返回的嵌套深度。它将返回lst
的副本,其中深度为r
的所有原子列表已被lst
替换。例如:
depth
== r
(replace-lats-at-depth 0 '(1 2 3) '*)
== '*
。
与(replace-lats-at-depth 1 '(1 (2) 3) '*)
一样,'(1 * 3)
在max-lat-depth
的{{1}}和replace-lats-at-depth
都会重复出现。它将调用first
对其递归调用的结果构造一个新的树结构。与rest
一样,它有几种情况,并且需要在其递归调用中从lst
减去 1。
让cons
工作以使用常量值max-lat-depth
替换嵌套列表后,使用生成depth
,{{的函数来改进它应该不会太难1}}等,就像你原来的例子一样。
我希望这有用但不要说太多。如果没有,请告诉我,我可以尝试澄清。