這個問題可以在http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-12.html#%_thm_1.37無法在SICP評估lambda表達式作爲參數前1.37
發現的問題是擴張的持續分數以便接近披。這意味着你的程序應該能夠通過評估計算披:
(cont-frac (lambda (i) 1.0)
(lambda (i) 1.0)
k)
我的解決方案如下:
(define (cont-frac n d k)
(if (= k 1) d
(/ n (+ d (cont-frac n d (- k 1))))))
時調用此方法適用於(續壓裂111 K),但不當問題表明使用lambda表達式時。我得到什麼看起來像一個類型的錯誤
;ERROR: "ex-1.37.scm": +: Wrong type in arg1 #<CLOSURE <anon> (x) 1.0>
; in expression: (#@+ #@d (#@cont-fraC#@n #@d (#@- #@k 1)))
; in scope:
; (n d k) procedure cont-frac
; defined by load: "ex-1.37.scm"
;STACK TRACE
1; ((#@if (#@= #@k 1) #@d (#@/ #@n (#@+ #@d (#@cont-fraC#@n #@d ...
我的問題是兩部分:
問題1:爲什麼我使用拉姆達參數,當我得到這個錯誤?我(錯誤地肯定)認爲(lambda(x)1)應該評估爲1.它顯然沒有。我不確定我是否理解它做了什麼評估:我認爲它沒有評估任何東西(即「返回一個值」 - 也許是錯誤的術語),而沒有通過x的參數。
它仍然沒有答案爲什麼你會有一個lambda返回一個常量。如果我理解正確,(lambda(x)1.0)將始終評估爲1.0,而不管x是什麼。那麼爲什麼不把1.0放在一起呢?這導致:
問題2.我爲什麼要使用它們?我懷疑這會在我看過的1.38版本中有用,但我不明白爲什麼使用(lambda(x)1.0)與使用1.0有什麼不同。
在你的1.37中,你應該用值k和0來調用它,而不是k和1 – WorBlux
固定,謝謝。在遞歸函數代碼中發現另一個問題。 – maxbublis