2012-10-25 42 views

回答

0

這裏有一種方法:

(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) 
+0

但是達到了特定的選擇數量。例如,(power-of-two 70(fn [p](println「two's power of」p)) – user1585646

+0

@ user1585646你可以把它放在一個函數中,我將更新我的答案 – ponzao

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) 
+0

但是直到特定例如,(power-of-two 70(fn [p](println「兩者的威力都是」p)) – user1585646

+0

他只是向你展示瞭如何用'(取10個冪) 。 – Rayne

+0

@ user1585646 - 如果你不斷糾正人們的答案,也許你應該修改你的問題。 – noahlz

8

獨立的任務分爲兩個步驟。

如果先創建一個懶惰的無限(無需事先決定你需要的最大功率)的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))

同時,作爲更普遍的,除非你有效率的關注,通過調用每次對於一個新的惰性序列,您避免保持頭部並允許內存被垃圾收集。

+1

+1(迭代...)版本。用*代替*來處理算術溢出會更好。 – JohnJ

+0

oops,添加到我的第一個示例中,然後在添加常規表單時將其忘記。編輯答案。謝謝。 – status203

+0

基於隨後提出的問題,要從0的指數開始2的冪,將第二個參數更改爲從2迭代到1.要使用「take」形式限制第n個指數的冪數,例如(以71的2次冪) – status203

0

有兩種方法來解釋「限制」,並從您的問題,它不知道你是什麼意思。

此外,你說「從1開始到極限」。你的意思是「從0^2開始(即1)到極限」或「從1^2開始(2)」?在下面的例子中,我假設你想從0^2開始。如果您想從1^2開始,請在下面的代碼中將(range)替換爲(drop 1 (range))

在第一種解釋中,「限制」的意思是「給我一個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)) 

另一個解釋是「給我的是小於限制大小的兩個連續的權力序列」。你可以用下面的方法做到這一點:

;; 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)