计划 - 有人可以向我解释这个输出吗?

时间:2017-08-23 13:38:25

标签: linked-list scheme racket fold

使用这些定义的函数:

(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)

此输出是什么意思?有人可以详细解释一下吗? 我需要在方案中用方框和指针表示法来绘制这个答案。

1 个答案:

答案 0 :(得分:1)

如果他们的cdr不是列表,则球拍打印将细胞作为“点对”。

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替换为z,将cons替换为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)

(绘制图表作为练习。)