2012-03-27 8 views
0

を質問再帰のこの例があります:スキーム/シンプルな再帰が<em>コンクリート抽象</em>で

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

この私が理解しています。たとえば、n = 3の場合、この関数は次のように評価されます。 (- (+ (+ (+ 1) 2) 3)) - > -6

ただし、次のいずれかの例では、操作の順序を切り替えることができない理由を説明しています。たとえば、のは、これを見てみましょう:私は(減算--first2 4)を呼び出す

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

場合、結果は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

関連する問題