程序员将如何继续产生从 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 的幂序列,您可以随后以您选择的任何方式对其进行切片和切块
(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)
这是一种方法:
(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)
有两种解释“限制”的方法,从你的问题来看,不确定你的意思是哪一种。
另外,您说“从 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)