【问题标题】:scheme - can someone explain this output to me?方案 - 有人可以向我解释这个输出吗?
【发布时间】:2017-08-23 13:38:24
【问题描述】:

使用这些定义的函数:

(define (foldr op z ls)
  (if (null? ls)
  z
  (op (car ls) (foldr op z (cdr ls)))))

(define (snoc x y) (cons y x))

当我运行这个时:

(foldr snoc '() (list 1 2 3))

我得到这个输出:

=> (((() . 3) . 2) . 1)

这个输出是什么意思?有人可以向我详细解释一下吗? 我需要根据方案中的框和指针符号来得出这个答案。

【问题讨论】:

    标签: linked-list scheme racket fold


    【解决方案1】:

    如果 cdr 不是列表,Racket 会将 cons 单元格打印为“点对”。

    来自 DrRacket 的示例:

    > (list 1 2)
    '(1 2)
    > '(1 . (2 . ()))
    '(1 2)
    > '(1 . 2)
    '(1 . 2)
    > (cons 1 2)
    '(1 . 2)
    > (cons 1 '())
    '(1)
    > (cons '() 1)
    '(() . 1)
    

    (foldr op z ls) 接受 ls 并将 nil 替换为 zcons 替换为 op

    也就是说,如果ls(cons a (cons b (cons c nil))),那么(foldr op z ls)

    (op a (op b (op c z)))
    

    在您的示例中,(foldr snoc '() (list 1 2 3))

    (snoc 1 (snoc 2 (snoc 3 '())))
    

    从最里面的snoc向外工作,

    (snoc 1 (snoc 2 (cons '() 3)))
    
    (snoc 1 (cons (cons '() 3) 2))
    
    (cons (cons (cons '() 3) 2) 1)
    

    将(在 DrRacket 中)打印为点对

    '(((() . 3) . 2) . 1)
    

    (画左图作为练习。)

    【讨论】:

    • 如果你知道(1 2 3)实际上是(1 . (2 . (3 . ())))的简化可视化,这就更容易理解了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2014-10-13
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多