私はClojureに関する多くのドキュメントを読み(そしてもう一度読む必要があります)、言語の「感触」をつかむためにSOでいくつかのClojureの質問を読みました。elisp のいくつかの小さな関数を除けば、これまで Lisp 言語で書いたことはありません。Clojure で最初のプロジェクト Euler ソリューションを作成しましたが、先に進む前にmapとreduceについて理解を深めたいと思います。
ラムダを使用して、次のようになりました(3または5の倍数、または1から1000までの両方の倍数をすべて合計するため):
(reduce + (map #(if (or (= 0 (mod %1 3)) (= 0 (mod %1 5))) %1 0) (range 1 1000)))
REPLに書いたので、1行にまとめました(そして、正しい解決策が得られます)。
ラムダなしで、私はこれを書きました:
(defn val [x] (if (or (= 0 (mod x 3)) (= 0 (mod x 5))) x 0))
そして、これを行う解を計算します。
(reduce + (map val (range 1 1000)))
どちらの場合も、 reduceを実行する前に map が何を返すべきかに関する質問です。マップを実行した後、次のようなリストになっていることに気付きました: (0 0 3 0 5 6 ...)。
val定義の末尾にある「0」を削除しようとしましたが、 (nil nil 3 nil 5 6 etc.)で構成されたリストを受け取りました。nilが問題かどうかはわかりません。ゼロが実際に問題にならないように、とにかく左折をしながら合計しようとしていることがわかりました。
それでもなお、返すべき賢明なマップとは何でしょうか? (0 0 3 0 5 6 ...) または (nil nil 3 nil 5 6 ...) または (3 5 6 ...) (この最後のものについてどうすればよいでしょうか?) または何か他のもの?
ゼロ/ゼロを「除外」する必要がありますか?
私は基本的な質問をしていることを知っていますが、マップ/リデュースは明らかに私がよく使うものなので、どんな助けも大歓迎です.