2012-03-27 44 views
0

混凝土抽象,有遞歸的這個例子:計劃/簡單而又重複的問題

(define subtract-the-first (lambda (n) 
          (if (= n 0) 0 
           (- (subtract-the-first (- n 1)) n)))) 

這我明白。例如,如果n = 3,則此函數的計算結果爲: (- (+ (+ (+ 1) 2) 3)) - > -6

但是,在其中一個後續示例中,應該解釋爲什麼無法切換操作順序。例如,讓我們來看看這個:

(define subtract-the-first2 (lambda (n) 
          (if (= n 0) 0 
           (- n (subtract-the-first2 (- n 1)))))) 

如果我叫(減去最first2 4),結果是2。但是,我不太明白評價。顯然,我在這裏犯了一個錯誤,因爲看到這個: (- 4 (+ 3 (+ 2 (+ 1)))),這等於(- 4 6),因此評估爲-2。

我明白任何指針,因爲我一直在敲打我靠在牆上頭半小時左右已經...

謝謝!

回答

2

您可以通過添加一些semiquote S和unquote支票此功能的評價:

(define subtract-the-first2 (lambda (n) 
           (if (= n 0) 0 
           `(- ,n ,(subtract-the-first2 (- n 1)))))) 

然後評估:

> (subtract-the-first2 4) 
(- 4 (- 3 (- 2 (- 1 0)))) 

這個計算結果爲2。 (我沒有看到你在哪裏得到了...)

+0

非常感謝!我對評估做了一些錯誤的假設,但現在已經很清楚了。 – talkinghead 2012-03-27 12:11:27