for-loop - 我怎样才能改变:while condition on a Clojure for-loop while it is running?

标签 for-loop clojure

我正在搜索所有三位数乘积的数字集中满足某些条件的最大数字。

最简单的方法是这样的:

(apply max (filter 
            my-test? 
            (for [x (range 100 1000)
                  y (range x 1000)]
              (* x y))))

但这涉及计算所有 900*900 产品的一半。例如,如果我发现 (* 380 455) 匹配我的 my-test? 谓词,我就不需要搜索任何一个因子小于 380 的产品。当然,如果我这样做,我也会想从最大到最小搜索列表。

在伪 Clojure 中,我想说这样的话:

(for [x (range 999 99 -1) :while (>= x P)
      y (range x 99 -1) :while (>= y P)]
  (* x y))

P 是我每次找到匹配项时神奇地设置为 (min x y) 的东西。

有没有办法在 Clojure 中做到这一点?

(考虑到我设置的这个特定问题,我意识到我可以以对角线方式搜索数字。但是,我现在正在尝试解决一般情况,即弄清楚如何告诉 for 循环它的一些分支需要修剪。)

最佳答案

@omeil 建议使用loop/recur 流程,这效果更好。 for 循环并不是为此而构建的。

(loop [x 999 y 999 min 99 candidates []]
    (cond (<= x min)          candidates ; exit condition
          (<= y min)          (recur (dec x) 999 min candidates) ; step x
          (my-test? (* x y)) (recur x (dec y) (max min y) (conj candidates (* x y)))
          :else               (recur x (dec y) min candidates) ; step y
     ))

关于for-loop - 我怎样才能改变:while condition on a Clojure for-loop while it is running?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20927195/

相关文章:

clojure - 使用Clojure中的自定义方法漂亮地打印记录

recursion - 从节点、父元素列表构建树

javascript - 在 Jade 中循环(目前称为 "Pug")模板引擎

javascript - 有人可以告诉我为什么这段代码无法运行吗?

python - Python 中同一行上 'raw_input' 的倒计时循环

java - 将 clojure 作为 JAVA 文件运行

clojure - 关闭 Light Table 中的自动完成功能

sql - 为什么有人要使用 JDBC 而不是 korma 之类的库?

python - 在最后一次迭代的 for 循环之外打印一些内容

Python:在列表中查找最长/最短的单词并在函数中调用它们