3

プログラマーは、1 から始まり、限界まで連続して 2 の累乗を生成するにはどうすればよいでしょうか?

ドキュメントhttp://clojuredocs.org/clojure_core/1.2.0/clojure.core/iterateを見ましたが、まだ助けが必要です。ありがとう。

4

4 に答える 4

8

タスクを 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))

より一般的であるだけでなく、効率の問題がない限り、新しい遅延シーケンスに対して毎回高階関数を呼び出すことで、ヘッドを保持することを回避し、メモリをガベージ コレクションできるようにします。

于 2012-10-25T10:19:35.877 に答える
1

フォームを使用できます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)
于 2012-10-25T09:49:46.500 に答える
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)
于 2012-10-25T09:46:19.727 に答える
0

「制限」を解釈するには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)
于 2012-10-25T11:29:52.973 に答える