Clojure 继承权

Clojure 继承权,clojure,Clojure,一个程序员如何从1开始产生连续的2次幂直到一个极限 我看到了文档,但仍然需要帮助。谢谢。这里有一种方法: (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 i

一个程序员如何从1开始产生连续的2次幂直到一个极限

我看到了文档,但仍然需要帮助。谢谢。

这里有一种方法:

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

您可以对表单使用

(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次幂的惰性无限序列(无需预先确定所需的最大幂),则随后可以选择任何方式对其进行切分

(def powers-of-2(迭代(部分*'2)2))

获得前n个幂

(取2的5次幂)

使功率小于70

(暂时(部分>70)二次幂)

增加:

实际上,我更喜欢更一般的形式:

(定义[n]的幂(迭代(部分*'n)n))

(取5(2的幂))


更一般地说,除非您担心效率问题,否则通过每次为新的延迟序列调用高阶函数,您可以避免抓住头部并允许对内存进行垃圾收集。

有两种解释“限制”的方法,从您的问题中不确定您指的是哪一种

还有,你说“从1开始到一个极限”。你的意思是“从0^2(即1)开始,直到达到极限”,还是“从1^2(即2)开始”?在下面的示例中,我假设您希望从0^2开始。如果要从1^2开始,请将下面代码中的
(范围)
替换为
(删除1(范围))

在第一种解释中,“极限”是指“给我一个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)
;;返回序列(0^2、1^2、2^2…2^7)
(对于[x(范围):让[r(数学/功率2 x)]:while( (2.0 4.0 8.0 16.0 32.0 64.0 128.0)

但最多可选择一个特定的数字。例如,(两个70的幂(fn[p](println“两个的幂是”p))@user1585646-如果你一直在纠正人们的答案,也许你应该修改你的问题。但要根据具体的选择数量。例如,(两个70的幂(fn[p](println“两个的幂是”p))@用户1585646您可以将其放入函数中。我将更新我的答案。+1表示(迭代…)版本。如果使用*'而不是*来处理算术溢出,效果会更好。oops,将其添加到我的第一个示例中,然后在添加一般形式时将其忘记。编辑了答案。谢谢。根据随后提出的问题,若要从指数0开始计算二的幂,请将第二个参数从2迭代为1。若要限制第n个指数的幂数使用“take”形式,例如(take 71次幂/2)即使是专门的幂/2形式也应该是一个(无参数)defn,而不是def。否则序列永远不会被垃圾收集,试图找到2的100亿次幂可能会耗尽内存。