Clojure 惰性序列最小最大查找器堆栈溢出问题

Clojure 惰性序列最小最大查找器堆栈溢出问题,clojure,lazy-evaluation,Clojure,Lazy Evaluation,我试图找出一个大表中每一列的最大值和最小值(固定长度序列的序列) 上面的代码适用于小表,但对于大表,会出现stackoverflow错误 (defn min-max-by-columns [s] (reduce (fn [[smallest largest] y] [(map min smallest y) (map max largest y)]) [(first s) (first s)] s)) 我是不是因为这条线而抓住了头?我需

我试图找出一个大表中每一列的最大值和最小值(固定长度序列的序列)

上面的代码适用于小表,但对于大表,会出现stackoverflow错误

 (defn min-max-by-columns [s]
   (reduce (fn [[smallest largest] y]
            [(map min smallest y) (map max largest y)])
      [(first s) (first s)]
      s))

我是不是因为这条线而抓住了头?我需要这些值才能使算法工作

我如何解决这个问题?

(映射最小值y)
没有任何意义。不是计算一个新的最小数,而是返回一个惰性序列
[(最小值)(最小值y)]
。最终,无数这些懒散的地图堆积在一起,你一下子就意识到了它们。这很容易修复,因为您不想首先映射任何内容

我有点惊讶你说这是“工作”的小序列。我可以看到它没有爆炸堆栈(当然),但我不知道它如何能够计算出正确的答案。无论如何,我的解决办法是

clojure.core/map/fn--3594 (core.clj:2370)
clojure.lang.LazySeq.sval (LazySeq.java:42)
clojure.lang.LazySeq.seq (LazySeq.java:60)
clojure.lang.RT.seq (RT.java:447)
clojure.core/seq (core.clj:133)
clojure.core/map/fn--3594 (core.clj:2371)
clojure.lang.LazySeq.sval (LazySeq.java:42)
clojure.lang.LazySeq.seq (LazySeq.java:60)
clojure.lang.RT.seq (RT.java:447)
clojure.core/seq (core.clj:133)
clojure.core/map/fn--3594 (core.clj:2371)
clojure.lang.LazySeq.sval (LazySeq.java:42)
clojure.lang.LazySeq.seq (LazySeq.java:60)
clojure.lang.RT.seq (RT.java:447)
clojure.core/seq (core.clj:133)
clojure.core/map/fn--3594 (core.clj:2371)

我似乎找到了解决办法。正如amalloy解释的那样,(map最小x)和(map max最大x)是同时实现的。然而,我正试图解决一个与他所解决的不同的问题。幸运的是,他的洞察力帮助我找到了解决方案;诀窍是将doall包装在每个映射上,以便在中间步骤中实现它们,而不是在最后一次实现所有

(defn min-max-by-columns [[x & xs]]
  (reduce (fn [[smallest largest] x]
            [(min smallest x) (max largest x)])
          [x x]
          xs))

在我看来,你并没有抓住头部,但我很好奇,如果你只是做了一个最小值或最大值,因此可以把
[(第一个s)(第一个s)]
从等式中去掉,例如,
(defn min columns[s](reduce(fn[x y](map min x y))s),会发生什么。我认为你们两个在解决不同的问题。他拿了一张二维表格,计算了两个列表,一个列中的数字最小,一个列中的数字最大<代码>(列[[1 2 9][4 5 6][7 8 3]]的最小最大值)
->
[(1 2 3)(7 8 9)]
。也许他只是需要在中间阶段严格一些?
 (defn min-max-by-columns [s]
   (reduce (fn [[smallest largest] y]
         [(doall (map min smallest y)) (doall (map max largest y))])
       [(first s) (first s)]
       s))