You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure中如何提前终止for循环,获取首个符合条件的[i,j]元组

解决方案

Clojure 中的 for 列表推导默认返回惰性序列,只要利用这个特性就能实现找到第一个符合条件的元素就终止遍历,不需要遍历所有i、j组合,有两种常用实现方式:

方案1:使用for+:when修饰符(最简洁)

直接给for加上:when条件过滤符合要求的下标,再取结果的首个元素即可,惰性特性会保证只计算到第一个符合条件的元素就停止:

(defn next-transformation [arr]
  (first (for [i (range (count arr))
               j (range (count arr))
               :when (> (nth arr i) (nth arr j))]
           [i j])))

这种写法和你给出的Java参考代码逻辑完全等价,不需要额外过滤nil值,代码精简易读。

方案2:优化你写的loop/recur版本

如果需要显式控制循环流程,可以把数组长度提前计算,拆分边界判断逻辑,简化写法:

(defn next-transformation [arr]
  (let [arr-len (count arr)]
    (loop [i 0 j 0]
      (cond
        ;; 遍历完所有i都没找到,返回nil
        (>= i arr-len) nil
        ;; 当前i对应的j遍历完,跳到下一个i,j重置为0
        (>= j arr-len) (recur (inc i) 0)
        ;; 找到符合条件的下标,直接返回
        (> (nth arr i) (nth arr j)) [i j]
        ;; 没找到,j加1继续循环
        :else (recur i (inc j))))))

这个版本避免了每次递归都重复计算数组长度,逻辑分支更清晰,减少出错概率。

内容的提问来源于stack exchange,提问作者Glory to Russia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 06:00:03