我有以下问题:我有一个超过10000个条目的时间序列,我想对每个条目执行一些计算。这本身不是问题,但我需要得到最后一个计算值,以便获得下一个值。我所需要的非常简单的形式如下所示:
Val(n) = Val(n-1) + (time-series-entry / 2) (或者类似的东西!)
我不知道该如何处理这件事。简单地做这样的事情:
(defn calc-val
[time-series element]
(seq (cons (generate-val-element time-series element)
(calc-val time-series (inc element)))))不能工作是因为不能工作(至少我不知道是怎么做的!)获取最后计算的值。然后我想:好的,让我们使用Loop-Recur。这将为我提供对应于时间序列条目的值,但对于下一个条目,我必须再次进行所有计算。Iterate应该是正确的,但它不起作用,因为函数有副作用。
所以我被困在这里了。如果有人能给我一个提示,那就太好了。
发布于 2010-07-13 22:49:30
如果您只关心最终结果,请使用reduce;如果您需要依次转换每个值的一系列结果(其中每个转换依赖于前面的转换),请使用reductions (可在1.1中的clojure.contrib.seq-utils和1.2中的clojure.core中找到)。
下面,transform-first-entry对第一个条目执行您想做的任何操作(如果您不需要以任何方式转换它,只需省略reduce / reductions的第一个参数,并使用entries而不是(rest entries作为最后一个参数);transform-entry是一个函数,它接受转换前一个条目和当前条目的结果(按此顺序),并为当前条目生成转换结果。
;;; only care about the final result
(reduce transform-entry
(transform-first-entry (first series))
(rest entries))
;;; need to get a seq of intermediate results
(reductions ...arguments as above...)注意,reductions是懒惰的。
假设您想要保持第一个条目不变,并将示例转换从问题文本应用到后续条目,您可以使用
(defn transform-entry [prev-transformed current]
(+ prev-transformed
(/ current 2)))中的归约函数
(reduce transform-entry series) ; ...or reductions发布于 2010-07-13 22:22:31
如果您只是想要一个提示,可以研究一下使用partition。
获取比提示更多的信息,…
(defn calc-val
[time-series element]
(let [p (partition 2 1 time-series)]
(for [t p]
(let [first-value (first t)
second-value (second t)]
(do whatever you need to here)))))虽然这还没有经过测试,但它应该可以工作或接近工作:)
说明
(partition n i seq)将seq分成长度为n (在本例中为2)和重叠i (在本例中为1)的部分,然后使用for遍历这些部分,并对这些部分做我们想做的事情。
https://stackoverflow.com/questions/3237949
复制相似问题