[解決済み] 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
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン