3

程序员将如何继续产生从 1 到极限的 2 的连续幂?

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

4

4 回答 4

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

除了更通用之外,除非您有效率问题,否则通过每次为新的惰性序列调用高阶函数,您可以避免抓住头部并允许内存被垃圾收集。

于 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

这是一种方法:

(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

有两种解释“限制”的方法,从你的问题来看,不确定你的意思是哪一种。

另外,您说“从 1 开始直到极限”。您的意思是“从 0^2(即 1)开始直到一个限制”,还是“从 1^2(即 2)开始”?在下面的示例中,我假设您要从 0^2 开始。如果您想从 1^2 开始,请在下面的代码中(range)替换为。(drop 1 (range))

在第一种解释中,“limit”的意思是“给我一个 n 元素的序列,其中元素是 2 的连续幂”。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))

另一种解释是“给我一系列小于限制的 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 回答