2016-09-05 14 views
0

とコードの改良:SICP - 私はSICP帳を使用していますが、私はこの練習をした、より抽象化

1.11関数fがそのF(N)= n(nは< 3と、fあれば、ルールによって定義されますn> 3の場合、f(n-1)+ 2f(n-2)+ 3f(n-3)となります。fを再帰的なプロセスで計算するプロシージャを記述します。反復処理によってfを計算する手続きを記述します。

再帰的な処理は簡単です。反復的なものは難しい。

私はこのコードをした:

(define (f-ltail n) 
    (f-iter 0 n)) 

(define (f-iter produto n) 
    (define counter (- n 2)) 
    (cond ((< n 3) n) 
     ((= counter 0) produto) 
     (else (+ produto (+ (f-iter produto (- n 1)) 
          (* 2 (f-iter produto (- n 2))) 
          (* 3 (f-iter produto (- n 3)))))))) 

私の教授は、我々が定義する必要はありません事を定める避けるべきだと言って続けています。

この定義は本当に必要ですか?

(define counter (- n 2)) 

このコードを削除するにはどうすればよいですか?

+0

なぜ私の投稿はダウン投票されましたか?私はオーバーフローをスタックオーバーフローに新しいです、それを把握することができませんでした... –

+1

'(=( - n 2)0)'を見るためにあなたはちょうど 'カウンター 'を使用しているので、それは単に難しい方法です'(= n 2)'第1項は '3'よりもすべてにヒットするので、' n'は '3'以上であるため第2項では' 2'にはなりません。反復的なプロセスは、尾部の再帰的なものになるので、すべての計算は引数上になければなりません。 – Sylwester

+0

'f-iter'が反復プロセスを生成しないという事実から始めましょう:そのためには、tail-callの位置になければなりません。実際、それは線形反復プロセスでなければなりませんが、プロシージャはツリー再帰をもたらします。 SICPでフィボナッチの例を調べて、コードを修正したのと同じ方法で修正してください。 – mobiuseng

答えて

0

書籍gives an exampleフィボナッチ数列が繰り返し計算される。

(define (fib n) 
    (fib-iter 1 0 n)) 

(define (fib-iter a b count) 
    (if (= count 0) 
     b 
     (fib-iter (+ a b) a (- count 1)))) 

代わりfib-iter関数内部カウンタ変数を定義するパラメータは、その値を追跡する関数に渡されることに注意してください。あなたはあなたの機能で同じパターンに従うことができます。

関連する問題