Racket と Dr. Racket と一緒に SICP の本を勉強しています。以下の講義も見ています。
第 3 章では、著者は命令型プログラミングの概念を提示します。
意味を説明しようとして、関数型プログラミングを使用した階乗手続きの実装と、命令型プログラミングを使用した実装を対比しています。
以下は、関数型プログラミングを使用した反復プロシージャの再帰的定義です。
(define (factorial-iter n)
(define (iter n accu)
(if (= n 0)
accu
(iter (- n 1) (* accu n))))
; (trace iter)
(iter n 1))
教授が必須の実装を提示する前に、私は自分自身を試しました。
コマンド「set!」を使用してこのコードに到達しました。
(define (factorial-imp n count product)
(set! product 1)
(set! count 1)
(define (iter count product)
(if (> count n)
product
(iter (add1 count) (* product count))))
(iter count product))
ただし、教授の実装は、私の必須の実装とはかなり異なります。
(define (factorial-imp-sicp n)
(let ((count 1) (i 1))
(define (loop)
(cond ((> count n) i)
(else (set! i (* count i))
(set! count (add1 count))
(loop))))
(loop)))
私の実装と教授のコードの両方のコードは、同じ結果に達します。しかし、それらが同じ性質を持っているかどうかはわかりません。
したがって、私は自問し始めました: 私の実装は本当に不可欠でしたか? 「セット!」を使用するだけです。それを保証しますか?
教授の補助反復関数には引数がまったくありませんが、私はまだ補助反復手順でパラメーターを使用しています。これは私の質問に答える核となるものですか?
ありがとう!SOユーザーは私を大いに助けてくれました!