Recursion 通过将前一项乘以常数来构建惰性seq
我从Clojure开始,尽管我对递归有一定的了解,但我在为以下函数构建惰性seq的“正确”方法上遇到了困难: 我想建立一个从中间C开始的所有频率的列表。我的第一个元素是120(中间C的频率)。为了得到第二个元素,我将第一个元素120乘以1.059463得到127.13556。为了得到第三个元素,我将第二个元素127.13556乘以1.059463,以此类推 在Clojure做这件事最好的方法是什么 您可以使用该函数进行此操作Recursion 通过将前一项乘以常数来构建惰性seq,recursion,clojure,Recursion,Clojure,我从Clojure开始,尽管我对递归有一定的了解,但我在为以下函数构建惰性seq的“正确”方法上遇到了困难: 我想建立一个从中间C开始的所有频率的列表。我的第一个元素是120(中间C的频率)。为了得到第二个元素,我将第一个元素120乘以1.059463得到127.13556。为了得到第三个元素,我将第二个元素127.13556乘以1.059463,以此类推 在Clojure做这件事最好的方法是什么 您可以使用该函数进行此操作 (iterate #(* % 1.059463) 120) 如果您
(iterate #(* % 1.059463) 120)
如果您计划将其扩展为更复杂的内容,那么您将创建一个在调用中递归调用自身的函数。(这就是
iterate
在内部所做的。)
如果您开始在一个紧密的循环中使用它,您可能还希望生成一个分块的惰性seq。这将预先计算接下来的几个元素,而不是逐个计算
(defn chunked-increasing-frequencies
([] (chunked-increasing-frequencies 120))
([freq]
(lazy-seq
(let [b (chunk-buffer 32)]
(loop [i freq c 0]
(if (< c 32)
(do
(chunk-append b i)
(recur (* i 1.059463) (inc c)))
(chunk-cons (chunk b) (chunked-increasing-frequencies i))))))))
(defn分块增加频率
([](分块增加频率120))
([freq]
(续)
(let[b(块缓冲区32)]
(环路[i频率c 0]
(如果(
注意:我建议您在测量与计算单个元素相关的性能问题之前不要这样做。您可以使用该函数进行此操作
(iterate #(* % 1.059463) 120)
(defn get-frequencies []
(iterate #(* 1.059463 %) 120))
如果您计划将其扩展为更复杂的内容,那么您将创建一个在调用中递归调用自身的函数。(这就是
iterate
在内部所做的。)
如果您开始在一个紧密的循环中使用它,您可能还希望生成一个分块的惰性seq。这将预先计算接下来的几个元素,而不是逐个计算
(defn chunked-increasing-frequencies
([] (chunked-increasing-frequencies 120))
([freq]
(lazy-seq
(let [b (chunk-buffer 32)]
(loop [i freq c 0]
(if (< c 32)
(do
(chunk-append b i)
(recur (* i 1.059463) (inc c)))
(chunk-cons (chunk b) (chunked-increasing-frequencies i))))))))
(defn分块增加频率
([](分块增加频率120))
([freq]
(续)
(let[b(块缓冲区32)]
(环路[i频率c 0]
(如果(
注意:我建议不要这样做,直到您测量了与计算单个元素相关的性能问题
(defn get-frequencies []
(iterate #(* 1.059463 %) 120))
看
或者,如果要显式使用,可以执行以下操作:
(defn get-frequencies-hard []
(cons
120
(lazy-seq
(map #(* 1.059463 %) (get-frequencies-hard)))))
这将cons
120转换为应用于map函数的每个值的延迟序列
看
或者,如果要显式使用,可以执行以下操作:
(defn get-frequencies-hard []
(cons
120
(lazy-seq
(map #(* 1.059463 %) (get-frequencies-hard)))))
这将cons
120转换为应用于map函数的每个值的延迟序列