Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 通过将前一项乘以常数来构建惰性seq_Recursion_Clojure - Fatal编程技术网

Recursion 通过将前一项乘以常数来构建惰性seq

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) 如果您

我从Clojure开始,尽管我对递归有一定的了解,但我在为以下函数构建惰性seq的“正确”方法上遇到了困难:

我想建立一个从中间C开始的所有频率的列表。我的第一个元素是120(中间C的频率)。为了得到第二个元素,我将第一个元素120乘以1.059463得到127.13556。为了得到第三个元素,我将第二个元素127.13556乘以1.059463,以此类推

在Clojure做这件事最好的方法是什么

您可以使用该函数进行此操作

(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函数的每个值的延迟序列