SICP 练习 3.13 - make-cycle
SICP exercise 3.13 - make-cycle
我正在做 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 个缺点单元格,但最后一个指向第一个,创建一个 循环 (一条蛇咬自己的尾巴)
我正在做 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 个缺点单元格,但最后一个指向第一个,创建一个 循环 (一条蛇咬自己的尾巴)