2

Clojure 言語の短いプレゼンテーションを行う必要があり、その中で単純なタスクの解決策も提供する必要があります。整数 n を入力し、合計を出力します: 1+2^2+3^2+...+n ^2. n が正になるように入力検証を使用します。

Lisp ダイアレクトまたは Java の以前の XP はまったくありませんが、この種のやりがいを感じています。私はどれくらい離れていますか?(たくさん推測):

(defn sum_of_squares [n]
(if (> n 0)
    (def sum 0)
    (dotimes [n]
        (+ sum (* n n)))))

ご覧のとおり、何が起こっているのかわかりません。実際にユーザーにnの値を入力し、後で合計を印刷するように求めるにはどうすればよいですか? また、(+ sum (* nn)式全体がその結果を格納し、その過程で合計を更新することになっているのはどこですか?

この問題を解決するもっと簡単な方法があるかもしれませんので、お気軽に教えてください :)。

4

2 に答える 2

1

さて、これは実際にはこれらの質問の種類の場所ではありませんが、これはClojureの質問であり、私は自分自身に抵抗することができません。

(defn sum-of-squares [n] (reduce (fn [memo x] (+ memo (* x x))) (range (inc n))))

また、関数型言語を扱うときは、不変性を考えてください。複雑にしないでください[1]。何かを初期化したら、スレッドセーフを念頭に置いて行わない限り、それを変更しようとしないでください。Clojureは、refs、atomsを使用してこれを簡単にします。非常に関連性の高いビデオは、リッチヒッキーの「SimpleMade Easy」[1]で、同じテーマについて話します。

于 2013-02-08T15:58:39.937 に答える
1

これは単純な機能ソリューションです。

(defn sum-of-squares [n] 
  (reduce + (map #(* % %) (range 1 (inc n)))))

内側から読んで、これがどのように機能するかを確認してください。

  • range1 から n を取得します (n 自体を含めたいため、上限として使用し(inc n)ます)
  • map#(* % %)引数を 2 乗する単なる無名関数です。これには、シーケンス内のすべての数値を 2 乗する効果があります。
  • reduceのシーケンス+- つまり、すべての四角形を一緒に追加して結果を取得します。
于 2013-02-09T11:52:14.813 に答える