Scheme - 查找最深层次的嵌套列表

时间:2011-12-02 11:09:30

标签: scheme

我需要在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天了。我想找个主意,不是实现。谢谢。

1 个答案:

答案 0 :(得分:2)

要想做对,这有点棘手。以下是一些方法的建议:

如上所述,问题是走遍列表,找到不包含任何其他列表的最深层嵌套列表(这些列表有时称为“原子列表”),并用其他内容替换它们。可以在一个递归函数中执行此操作,但我认为将其分解为部分更清晰:

  1. 首先,我们需要一个谓词(一个返回布尔值#t#f的函数)来确定列表是否是原子列表。 (有时称为lat?)。你可以把它写成一个简单的递归函数,或者你可以使用库函数anylist?

  2. 然后我们需要一个函数(define (max-lat-depth lst) ...)来查找嵌套在其参数中最深层嵌套的原子列表的深度。这将是一个双重递归函数 - 它需要检查每个列表的first以及rest中的所有元素。我们可以按如下方式定义max-lat-depth

    一个。如果参数本身为lat,则最大深度为零,因此(max-lat-depth '(1 2 3)) == 0

    湾如果参数的第一个元素不是列表,则它不会影响整体的最大嵌套深度。因此,在这种情况下,整个参数的max-lat-depth将与列表的max-lat-depthrest)的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。我会告诉你哪一个以及为什么。

  3. 最后,我们编写一个函数cdr,它将采用从lst,列表(define (replace-lats-at-depth depth lst r) ...)和替换max-lat-depth返回的嵌套深度。它将返回lst的副本,其中深度为r的所有原子列表已被lst替换。例如:

  4. 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}}等,就像你原来的例子一样。

    我希望这有用但不要说太多。如果没有,请告诉我,我可以尝试澄清。