SICP問題3.14
mystery手続き(教科書で定義)
(define (mystery x) (define (loop x y) (if (null? x) y (let ((temp (cdr x))) (set-cdr! x y) (loop temp x)))) (loop x '()))
この手続きが一般に何をするのか、'(a b c d)を使って考えてみる
(mystery x) loop呼び出し x (a b c d) y () temp (b c d) (set-cdr! x y) x (a) loop呼び出し(引数 temp, x) x (b c d) y (a) temp (c d) (set-cdr! x y) x (b a) loop呼び出し(引数 temp, x) x (c d) y (b a) temp (d) (set-cdr! x y) x (c b a) loop呼び出し(引数 temp, x) x (d) y (c b a) temp () (set-cdr! x y) x (d c b a) loop呼び出し(引数 temp, x) x () y (d c b a) → 終了yを返す。
上で見たようにこれは反転したリストを返す手続きである。
以下に箱とポインタ図を示す
vの定義
(define v (list 'a 'b 'c 'd)) v ; (a b c d)
この時点での箱とポインタ図
v→□□→□□→□□→□■ ↓ ↓ ↓ ↓ a b c d
(define w (mystery v)) w ; (d c b a)
この時点での箱とポインタ図
v ↓ w→□□→□□→□□→□■ ↓ ↓ ↓ ↓ d c b a