プログラマーは、1 から始まり、限界まで連続して 2 の累乗を生成するにはどうすればよいでしょうか?
ドキュメントhttp://clojuredocs.org/clojure_core/1.2.0/clojure.core/iterateを見ましたが、まだ助けが必要です。ありがとう。
プログラマーは、1 から始まり、限界まで連続して 2 の累乗を生成するにはどうすればよいでしょうか?
ドキュメントhttp://clojuredocs.org/clojure_core/1.2.0/clojure.core/iterateを見ましたが、まだ助けが必要です。ありがとう。
タスクを 2 つのステップに分けます。
最初に怠惰な無限 (必要な最大電力を事前に決定する必要はありません) 2 のべき乗のシーケンスを作成した場合、その後、任意の方法でスライス アンド ダイスすることができます。
(def powers-of-2 (iterate (partial *' 2) 2))
最初の n 乗を取得するには
(take 5 powers-of-2)
パワーを70以下にする
(take-while (partial > 70) powers-of-2)
追加した:
実際、私はより一般的な形式を好みます。
(defn powers-of [n] (iterate (partial *' n) n))
(take 5 (powers-of 2))
より一般的であるだけでなく、効率の問題がない限り、新しい遅延シーケンスに対して毎回高階関数を呼び出すことで、ヘッドを保持することを回避し、メモリをガベージ コレクションできるようにします。
フォームを使用できますfor
:
(def powers (for [x (range)]
(java.lang.Math/pow 2 x)))
(take 10 powers)
(1.0 2.0 4.0 8.0 16.0 32.0 64.0 128.0 256.0 512.0)
これが1つの方法です:
(defn powers-of-two
[n]
(map ; we are mapping over a sequence
(comp int #(Math/pow 2 %)) ; a composition of two functions
; Math/pow returns doubles so int is used to make them into integers
(range 1 (inc n)))) ; a sequence from 1 to 10
(powers-of-two 15) ;=> (2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768)
「制限」を解釈するには2つの方法があり、あなたの質問から、どちらを意味するのかわかりません。
また、「1から始めて限界まで」と言います。「限界まで 0^2 (1) から開始」または「1^2 (2) から開始」という意味ですか? 以下の例では、0^2 から始めたいと想定しています。1^2 で開始する場合は、以下のコードで(range)
に置き換えます。(drop 1 (range))
最初の解釈では、「制限」は「要素が連続する 2 のべき乗である n 個の要素のシーケンスを与える」ことを意味します。Ankur などは、その方法を示しました。
;; return the sequence (0^2, 1^2, 2^2 ... 149^2)
(take 150 (for [x (range)] (java.lang.Math/pow 2 x)))
; => (1.0 2.0 4.0 8.0 ..... 7.1362384635297994E44)
;; this is functionally equivalent:
(for [x (range 150)] (java.lang.Math/pow 2 x))
もう 1 つの解釈は、「制限よりも小さい連続する 2 のべき乗のシーケンスを教えてください」です。次のようにしてそれを行うことができます:
;; return the sequence (0^2, 1^2, 2^2 ... 2^7)
(for [x (range) :let [r (Math/pow 2 x)] :while (< r 150)] r)
; => (2.0 4.0 8.0 16.0 32.0 64.0 128.0)