在这个问题上可能没有输出吗?

时间:2019-12-25 20:17:55

标签: list scheme

我知道cddar表示列表中 first second second ,但是没有第二个2。这是否意味着2的第二个是nil,因为没有一个,或者我做错了这个问题,还是输出了2

(cddar '((1 2) 3 (4 5)))

2 个答案:

答案 0 :(得分:0)

cddarcdr的{​​{1}}的{​​{1}}相同,所以让我们看一下它如何逐步评估:

cdr

所以car / (cdr (cdr (car '((1 2) 3 (4 5))))) => (cdr (cdr '(1 2))) => (cdr '(2)) => '() nil的结果。而且,它不是()

这是因为每个适当的列表在 cons单元格的第二个插槽中以(cddar '((1 2) 3 (4 5)))结尾:

(cdr 2)

所以nil是一个元素的 list 。在 cons cell 的第一个插槽中有(cons 2 '()) => (2) ,在第二个插槽中有(2)。这就是2()的原因。

答案 1 :(得分:0)

您需要查看这些对...它们是:

(cons (cons 1 (cons 2 '()))
      (cons 3
            (cons (cons 4 (cons 5 '()))
                  '())))

或以点符号表示:

'((1 . (2 . ())) . (3 . ((4 . (5 . ())) . ())))

当我看到((1 2) 3 (4 5))时,会看到表示形式中缺少的不可见点和多余的括号。如果.之后的部分是一对,则可以简化cdr上的点和一组括号。仅当cdr上没有括号时,方案才会显示点。像'(4 . 5)总是这样打印,而'(4 . (5 . ()))总是在打印中简化为'(4 5)。只要您不明白,由于列表是虚构的,您将在列表方面遇到困难!对是真正的数据结构。

您要应用cddar。您只需从右到左执行da。因此,您想要car,然后是cdr,然后是cdr。使用car,您选择点的左侧,而使用cdr,您选择点的右侧。让我们在((1 . (2 . ())) . (3 . ((4 . (5 . ())) . ())))上进行操作。

  1. init => ((1 . (2 . ())) . (3 . ((4 . (5 . ())) . ())))
  2. car => (1 . (2 . ()))
  3. cdr => (2 . ())
  4. cdr => ()