我的SICP習(xí)題答案(1.6)
會(huì)遞歸直到堆棧溢出。
原因是 在 new-if 還沒有展開為 cond special forms 時(shí),else-clause 子式已經(jīng)陷入了無(wú)限遞歸。 做了以下實(shí)驗(yàn),可以驗(yàn)證
對(duì)于 (iter 1 10), (iter-if 1 10), (iter-cond 1 10)
其中 iter 會(huì) 導(dǎo)致堆棧溢出,而 iter-cond 和 iter-if 并不會(huì)。
此題同1.5
在1.5中,由于應(yīng)用序的原因,在 test 表達(dá)式 還沒有展開為 if 特殊形式(special forms)時(shí), (p)已經(jīng)陷入了無(wú)限遞歸。
原因是 在 new-if 還沒有展開為 cond special forms 時(shí),else-clause 子式已經(jīng)陷入了無(wú)限遞歸。 做了以下實(shí)驗(yàn),可以驗(yàn)證
(define (new-if pred thenc elsec)
(cond (pred thenc)
(else elsec)))
(define (iter x y)
(new-if (= x y)
0
(iter (+ x 1) y)))
(define (iter-if x y)
(if (= x y)
0
(iter-if (+ x 1) y)))
(define (iter-cond x y)
(cond ((= x y) 0)
(else (iter-cond (+ x 1) y))))
(cond (pred thenc)
(else elsec)))
(define (iter x y)
(new-if (= x y)
0
(iter (+ x 1) y)))
(define (iter-if x y)
(if (= x y)
0
(iter-if (+ x 1) y)))
(define (iter-cond x y)
(cond ((= x y) 0)
(else (iter-cond (+ x 1) y))))
對(duì)于 (iter 1 10), (iter-if 1 10), (iter-cond 1 10)
其中 iter 會(huì) 導(dǎo)致堆棧溢出,而 iter-cond 和 iter-if 并不會(huì)。
此題同1.5
在1.5中,由于應(yīng)用序的原因,在 test 表達(dá)式 還沒有展開為 if 特殊形式(special forms)時(shí), (p)已經(jīng)陷入了無(wú)限遞歸。
posted on 2008-03-09 23:12 cuigang 閱讀(1759) 評(píng)論(9) 編輯 收藏 引用 所屬分類: Lisp/Scheme 、我的SICP答案