Clojure连续权力

时间:2012-10-25 09:26:51

标签: clojure

如果一个程序员如何继续从1开始产生两个连续的2次幂?

我看到了文档http://clojuredocs.org/clojure_core/1.2.0/clojure.core/iterate,但仍然需要帮助。感谢。

4 个答案:

答案 0 :(得分: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)

您可以使用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)

答案 2 :(得分: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)

答案 3 :(得分: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)