1. ホーム
  2. scheme

[解決済み] RACKETでスクエアを行う方法

2022-02-10 10:44:35

質問

以下は私のコードです。

(define (squares 1st)
  (let loop([1st 1st] [acc 0])
    (if (null? 1st)
        acc
        (loop (rest 1st) (* (first 1st) (first 1st) acc)))))

私のテストは

(test (sum-squares '(1 2 3)) => 14 )

で、失敗しています。

関数の入力は、例えば[1 2 3]という数字のリストで、それぞれの数字を二乗して合計し、出力 - 数字とする必要があります。 テストは、正しい答えが入力された場合、#tを返します。

どのように解決するのですか?

これは、むしろあなたの 前の質問 しかし、ここでは一工夫しています。 加える 乗算の代わりに そして、各要素は足す前に2乗されます。

(define (sum-squares lst)
  (if (empty? lst)
      0
      (+ (* (first lst) (first lst))
         (sum-squares (rest lst)))))

先ほどと同様に、末尾再帰を使って手順を書くこともできます。

(define (sum-squares lst)
  (let loop ([lst lst] [acc 0])
    (if (empty? lst)
        acc
        (loop (rest lst) (+ (* (first lst) (first lst)) acc)))))

どちらのソリューションも同じ構造を共有していること、何が変わるのかを認識する必要があります。

  • を使用します。 + から 組み合わせる の代わりに、答えを *
  • 私たち スクエア 現在の要素 (first lst) 追加する前に
  • リストを追加する基本的なケースは 0 (それは 1 乗算の場合)

最後のコメントとして、実際のアプリケーションでは、明示的な再帰を使うべきではありません。その代わりに、高次の手続きで解を構成します。

(define (square x)
  (* x x))

(define (sum-squares lst)
  (apply + (map square lst)))

あるいはもっと短く、ワンライナーとして(でも square というプロシージャがあるので、私は前の解決策を好みます)。

(define (sum-squares lst)
  (apply + (map (lambda (x) (* x x)) lst)))

もちろん、上記のどの解決策も期待通りに動作します。

(sum-squares '())
=> 0

(sum-squares '(1 2 3))
=> 14