2011-07-13 25 views
2

我學習的SiC顆粒的書,我有一個疑問有一個過程的替代模式:幫助的替代模式[SICP],使用Clojure的

(defn A 
    [x,y] 
    (cond (= y 0) 0 
      (= x 0) (* 2 y) 
      (= y 1) 2 
      :else (A (- x 1) (A x (- y 1))))) 

這個過程是練習1.10的一部分。 如果我在REPL用以下參數(A 110),結果是1024運行函數我決定使用替代模式以驗證結果,但結果是2048。

這是置換模型我寫了。有什麼不對,但我不知道是什麼。

(A 1 10) 
(A (- 1 1) (A 1 (- 10 1)))) 
(A 0 (A 1 9))) 
(A 0 (A (- 1 1) (A 1 (- 9 1))))) 
(A 0 (A 0 (A 1 8)))) 
(A 0 (A 0 (A (- 1 1) (A 1 (- 8 1)))))) 
(A 0 (A 0 (A 0 (A 1 7))))) 
(A 0 (A 0 (A 0 (A (- 1 1) (A 1 (- 7 1))))))) 
(A 0 (A 0 (A 0 (A 0 (A 1 6)))))) 
(A 0 (A 0 (A 0 (A 0 (A (-1 1) (A 1 (- 6 1)))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 5)))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A (-1 1) (A 1 (- 5 1)))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 4))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A (-1 1) (A 1 (- 4 1))))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 3)))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A (-1 1) (A 1 (-3 1)))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 2))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A (-1 1) (A 1 (- 2 1)))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1)))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (* 2 1)))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 2))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (* 2 2))))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 4)))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (* 2 4)))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 8))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (* 2 8))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 16)))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (* 2 16))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 32)))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (* 2 32)))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 64))))) 
(A 0 (A 0 (A 0 (A 0 (* 2 64))))) 
(A 0 (A 0 (A 0 (A 0 128)))) 
(A 0 (A 0 (A 0 (* 2 128)))) 
(A 0 (A 0 (A 0 256))) 
(A 0 (A 0 (* 2 256))) 
(A 0 (A 0 512)) 
(A 0 (* 2 512)) 
(A 0 1024) 
2048 ???? 

任何人都可以表明我做錯了什麼? 對於問題的長度,我感到抱歉。

回答

5

考慮這些行:

(A 0 (A 0 (A 0 (A 1 7))))) 
(A 0 (A 0 (A 0 (A (- 1 1) (A 1 (- 7 1))))))) 
(A 0 (A 0 (A 0 (A 0 (A 1 6)))))) 
(A 0 (A 0 (A 0 (A 0 (A (-1 1) (A 1 (- 6 1)))))))) 
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 5)))))))) 

剝去多餘的外層:

(A 1 7)) 
(A (- 1 1) (A 1 (- 7 1)))) 
(A 0 (A 1 6))) 
(A 0 (A (-1 1) (A 1 (- 6 1))))) 
(A 0 (A 0 (A 0 (A 1 5))))) 

某處在這裏,你已經結束了不匹配的括號,但是這並不重要。請注意,從A 1 7A 1 6,如預期的那樣創建了一個外層A 0 _。在從A 1 6A 1 5,你有兩個新層A 0 _。這些都會使結果翻一番,所以這就是爲什麼你的答案是因爲2。

+0

謝謝,camccann! –

+1

這是一個很好的例子,你爲什麼不應該親手做什麼你應該問一臺電腦爲你做! –