3
(define (sum-two-sqrt a b c)

    (cond ((and (<= c a) (<= c b)) sqrt-sum(a b))
           ((and (<= a b) (<= a c)) sqrt-sum(b c))
           ((and (<= b a) (<= b c)) sqrt-sum(a c))
    )
)
(define (sqrt-sum x y)
           (+ (* x x) (*y y))
)
(define (<= x y)
      (not (> x y))

(sum-two-sqrt 3 4 5)

これは私のコードです

問題を解決するのを手伝ってください。:)

今日からLispの勉強を始めました。

以前にいくつかのCを学びましたが、2つの言語はかなり異なります!

これは、引数として3つの数値を取り、2つの大きい数値の2乗の合計を返すプロシージャを定義するという質問です。

あなたがより良いアルゴリズムを持っているなら

投稿してください!

ありがとうございました :)

4

4 に答える 4

3

を定義する必要はありません<=。これは基本的な操作です。いくつかのタイプミスを修正した後:

  • sqrt-sum: プロシージャを誤って呼び出していました。左括弧は、 のではなく、プロシージャ名のに書かなければなりません。
  • sqrt-sum:(*y y)間違ってい(* y y)ます。演算子の問題の後のスペース。

これはうまくいくはずです:

(define (sqrt-sum x y)
  (+ (* x x) (* y y)))

(define (sum-two-sqrt a b c)
  (cond ((and (<= c a) (<= c b)) (sqrt-sum a b))
        ((and (<= a b) (<= a c)) (sqrt-sum b c))
        ((and (<= b a) (<= b c)) (sqrt-sum a c))))

または別の選択肢:

(define (sum-two-sqrt a b c)
  (let ((m (min a b c)))
    (cond ((= a m) (sqrt-sum b c))
          ((= b m) (sqrt-sum a c))
          (else (sqrt-sum a b)))))
于 2012-09-13T05:00:27.080 に答える
1

@J.Spiral による提案をフォローアップし、@River が支援した次の Racket コードは、私にとっては読みやすいものです。

#lang racket

(define (squares-of-larger l)
  (define two-larger (remove (apply min l) l))
  (for/sum ([i two-larger]) (* i i)))

(squares-of-larger '(3 1 4)) ;; should be 25

「削除」は新しいリストを返すだけなので、このソリューションは完全に機能することに注意してください。

また、これは HtDP と同じ近隣にさえないことに注意してください。これを簡潔に表現して、for/sum を誇示したかっただけです。

于 2012-09-13T05:20:50.550 に答える
0

アルゴリズムは機能しているようです。

*y

* y

ここでは空白が重要です。それ以外の場合は、関数を使用することをインタープリターに伝えています。*y

後に閉じ括弧を追加

(define (<= x y) (not (> x y))

sqrt-sum(a b) 

に変わります

(sqrt-sum a b)

他の sqrt-sum 呼び出しについても同様です

編集:可能性もあります:

(define (square a) (* a a))
(define (square-sum a b c)
    (- (+ (square a) 
          (square b)
          (square c))
       (square (min a b c))))
于 2012-09-13T05:04:06.940 に答える
0

ここにはSchemeインタープリターがありませんでしたが、以下は他の提案よりも短いようです:)つまり、CLにありますが、Schemeでも非常に似ているはずです。

(defun sum-two-sqrt (a b c)
  (let ((a (max a b))
        (b (max (min a b) c)))
    (+ (* a a) (* b b))))

スキームでは、これは次のように変換されます。

(define (sum-two-sqrt a b c)
  (let ((a (max a b))
        (b (max (min a b) c)))
    (+ (* a a) (* b b))))
于 2012-09-13T09:41:19.997 に答える