linked-list - SICP 练习 3.13 - 制作周期

标签 linked-list scheme lisp sicp recursive-datastructures

我在做exercise 3.13 from SICP但我不确定我的答案。

Exercise 3.13: Consider the following make-cycle procedure, which uses the last-pair procedure defined in Exercise 3.12:

(define (make-cycle x) (set-cdr! (last-pair x) x) x)

Draw a box-and-pointer diagram that shows the structure z created by

(define z (make-cycle (list 'a 'b 'c)))

What happens if we try to compute (last-pair z)?

我试图理解为什么

(last-pair z)

变成无限循环。忽略盒子和指针图,这是我的理解:

(set-cdr! (last-pair x) x)

(last-pair x) 将是 (cons 'c '()) 对,然后当我们执行 set-cdr! 这对将变成:

(cons 'c (cons 'a (cons 'b (cons 'c (cons 'a (cons 'b (cons 'c (cons 'a (cons 'b (cons 'c ...))))))))))

我的理解正确吗?

最佳答案

没有。

您的答案似乎表明 (last-pair x) 是无限多次调用 cons 的结果。

并非如此。

x仍然只有 3 个 cons 单元,但最后一个指向第一个,创建一个循环(一条蛇咬自己)在尾部上)。

关于linked-list - SICP 练习 3.13 - 制作周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43188415/

相关文章:

python - equals方法怎么写

c++ - 排序节点(链表)C++

macros - Racket - 使用宏实现 let* 函数

list - 检查 clisp 中的模式列表

java - 在方法中重新分配引用是如何工作的?

c - 链表打印段错误

f# - 学习 F# 时要记住什么,学习了 Scheme

scheme - drracket 中 python 'pass' 的等价物

list - 在 Lisp 中不使用 mapcar 将列表中的数字相乘(坐标方式)

macros - 为什么 let 需要一个向量?