2009-07-23 14 views
49

私はちょうどSICPの仕事を始めています(これはクラスではありません)、私は2,3日間練習1.6に苦労しています。私はそれを理解できないようです。彼女はいくつかの簡単な例で正常にそれをテストして、ちょうど働いた平方根プログラムを(再書き込みするためにそれを使用していますSICPでの演習1.6の説明は何ですか?

(define (new-if predicate then-clause else-clause) 
    (cond (predicate then-clause) 
      (else else-clause)) 

:これは、アリッサは1であるので、同様に、condの面でifを再定義しますif罰金):

(define (sqrt-iter guess x) 
    (new-if (good-enough? guess x) 
      guess 
      (sqrt-iter (improve guess x) 
         x))) 

質問そして尋ねる:「アリッサは平方根を計算するためにこれを使用するために説明しようとしたときに何が起こります?。」 [good-enough?improveなど]を再現してもらえれば幸いです。]

ここで私は何が起こるか知っています。これは決して値を返しません。つまり、プログラム無限に繰り返すなぜこれが起こるのか説明できません。 ifnew-ifの間に何らかの微妙な違いがあっても私は逃げ出しています。どなたでも大歓迎です。

+1

"再帰的"の動詞形式は "再帰する"ため、 "再帰的"になります。 –

+0

あなたの質問のタイトルは間違っています:あなたは1.4ではなく、エクササイズ1.6を指しています。 – systemovich

+1

@Geoffrey Van Wykそうです。私が質問を書いたとき、私はSICP第1版の私の古いコピーを使って作業していました。この問題は、練習問題1.4に現れています。第2版​​では、エクササイズ1.6です。私は変更を行います。 –

答えて

62

new-ifは関数です。関数が呼び出されたとき、Schemeが引数リストで最初に行うことは何ですか?それはすべて引数を評価します。

20

まずは申請注文評価と通常の注文との間にunderstand the differenceが必要です。 LispはApplicativeの順序を使用しますが、条件式ではない通常の機能(sicp chapter 1.1.6)のように評価されます。

(if <predicate> <consequent> <alternative>) 

は表現ならば、インタプリタは、式の<predicate>一部を評価することによって開始評価します。 <predicate>が真の値と評価された場合、インタープリタは<consequent>を評価し、その値を返します。それ以外の場合は<alternative>を評価し、その値を返します。

28

new-ifは、プロシージャで、SchemeはApplicativeの次評価(1.1.5)を使用するため、new-ifが実際に行われる前であっても、それはguess(sqrt-iter (improve guess x) x)である、最初にすべての引数を評価することがあります。後者の引数は再帰であり、これは新しいnew-ifというプロシージャを呼び出します。これが無限ループの発生方法です。

普通のifは、最初に引数を評価する必要はありません。ちょうど道に沿って行ってください。これはifnew-ifの違いです。 :)

+0

'new-if'手続きには、'述語 '、' then節 '、' else節 'という3つの引数があります。したがって、 'new-if'が呼び出されると'(十分に良いと推測されます) '、'推測 '、'(sqrt-iter(推測xが改善される) ')が評価されます。そうですか? 'sqrt-iter'の評価だけで問題が発生するため、結果は変わりません。しかし、あなたは1つの議論を忘れてしまった... –

関連する問題