1.1
10,12,8,3,10 6,a,b,19,#f,4,16,6,16
1.2
(/(+ 5 4 (- 2 (- 3 (+ 6(/ 4 5)))))(* 3 (- 6 2)(- 2 7)))
or
(/(+ 5 4 (- 2 (- 3 (+ 6 4/5))))(* 3 (- 6 2)(- 2 7)))
1.3
這個(gè)問(wèn)題中文版的翻譯是錯(cuò)的,參看原文是求平方和而不是“和”。
(define (square(x)(* x x)))
(define (max x y)(if (< x y) y x))
(define (func x y z)
(+ (square (max x y))
(square (max (min x y) z))))
1.4
a+|b|
<=>
1 # in python
2 def a_plus_abs_b(a,b):
3 if b>0 :
4 x = a + b
5 else:
6 x = a - b
7 return x
1.5
在網(wǎng)上看了很多答案,都認(rèn)為“應(yīng)用序”的實(shí)現(xiàn)會(huì)導(dǎo)致死循環(huán),我非常困惑。反復(fù)看了中文版和英文版,覺(jué)得大家這樣認(rèn)為可能是書(shū)中說(shuō)lisp的實(shí)現(xiàn)是“應(yīng)用序”,而在scheme中跑這段代碼會(huì)死循環(huán),就先入為主的認(rèn)為“應(yīng)用序”的實(shí)現(xiàn)會(huì)死循環(huán)。其實(shí)對(duì)照正文,我們可以看到“正則序”停止展開(kāi)的條件是“只包含基本運(yùn)算符的表達(dá)式”,而對(duì)于
(define (p) (p))
是無(wú)論如何也沒(méi)法完全展開(kāi)的,因?yàn)樗鼤?huì)不斷遞歸,所以“正則序”才會(huì)死循環(huán)。
而對(duì)于“應(yīng)用序”的實(shí)現(xiàn),則會(huì)這樣展開(kāi)
(test 0 (p))
(if (= 0 0) 0 (p))
(if #t 0 (p))
; 0
解決這個(gè)問(wèn)題主要是“正則序”(Normal order)以及“應(yīng)用序”(Applicative order)展開(kāi)一個(gè)組合式的規(guī)則,仔細(xì)研究了MIT 6.001課程講義,網(wǎng)上的各種答案,以及中英文版。我認(rèn)為,正則序以類似廣度優(yōu)先的方式進(jìn)行展開(kāi)。而應(yīng)用序優(yōu)先計(jì)算子表達(dá)式,類似與深度優(yōu)先。那么對(duì)于這個(gè)問(wèn)題,正則序會(huì)展開(kāi)為
=> (if (= 0 0) 0 (p))
=> (if #t 0 (p))
接著,由于這是一個(gè)if的special form(特殊形式),就會(huì)被展開(kāi)為
0
而應(yīng)用序,由于(p)一直可以遞歸代換,從一開(kāi)始就會(huì)進(jìn)入一個(gè)無(wú)限遞歸中去。
簡(jiǎn)言之,由于應(yīng)用序的原因,在 test 表達(dá)式 還沒(méi)有展開(kāi)為 if 特殊形式(special forms)時(shí), (p)已經(jīng)陷入了無(wú)限遞歸。