使用这些定义的函数:
(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)
此输出是什么意思?有人可以详细解释一下吗? 我需要在方案中用方框和指针表示法来绘制这个答案。
答案 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)
(绘制图表作为练习。)