2

私は計画の初心者です。私はこのような機能を持っています:

(define (getRightTriangle A B N) (
                            cond
                              [(and (integer? (sqrt (+ (* A A) (* B B)))) (<= (sqrt (+ (* A A) (* B B))) N))
                               (list (sqrt (+ (* A A) (* B B))) A B)
                               ]
                              [else (list)]

                            )

この関数では、(sqrt (+ (* AA) (* BB))) を数回計算します。この関数の最初に一度だけこの式を計算したい(定数または変数にする)が、方法がわからない...

4

2 に答える 2

3

defineいくつかのオプションがあります。まず、次のような特別なフォームを使用できます。

(define (getRightTriangle A B N)
  (define distance (sqrt (+ (* A A) (* B B))))
  (cond [(and (integer? distance) (<= distance N))
         (list distance A B)]
        [else (list)]))

またはlocal、高度な教育言語のいずれかを使用している場合に使用します。

(define (getRightTriangle A B N)
  (local [(define distance (sqrt (+ (* A A) (* B B))))]
    (cond [(and (integer? distance) (<= distance N))
           (list distance A B)]
          [else (list)])))

またはlet、ローカル変数を作成するための特別な形式のいずれかを使用します。これは、IMHO が最もクリーンな方法です。

(define (getRightTriangle A B N)
  (let ((distance (sqrt (+ (* A A) (* B B)))))
    (cond [(and (integer? distance) (<= distance N))
           (list distance A B)]
          [else (list)])))

distanceいずれにせよ、変数に適切な名前 (この場合) を選択し、式の残りの部分でその名前を参照することがいかに重要であるかに注意してください。また、使用している言語 (初級者、上級者など) によって、使用できるオプションが制限される可能性があることにも注意してください。

于 2013-04-20T13:34:46.173 に答える
1

letフォーム (およびそれに関連するフォームlet *、letrecletrec *)を見てください。良い説明はhttp://www.scheme.com/tspl4/start.html#./start:h4http://www.scheme.com/tspl4/binding.html#./binding:h4です。

于 2013-04-20T13:15:00.050 に答える