在 Clojure 中退出 Recur 循环

2024-05-09

我想跳出下面的循环,并在第 10 行计算结果为 true 时返回最佳最小移动。我查看了 print 语句的输出,当第 10 行的计算结果为 true 时,它​​找到了我正在查找的数据,但仍然重复出现。在 Clojure 中,有没有办法在语句计算结果为 true 时停止循环?或者我应该使用循环之外的其他东西?

(defn minimax [board max-mark min-mark depth best-score] 
  (loop [board board
     max-mark max-mark
     min-mark min-mark
     depth depth
     best-score best-score]
  (if (= best-score (best-min-score board max-mark min-mark depth))
   (best-max-move board max-mark min-mark depth)                     
   (do                                                               
      (if (= best-score (best-min-score board min-mark max-mark depth))
       (best-min-move board min-mark max-mark depth)              
       (recur 
         (b/make-move-on board (remaining-scores board max-mark min-mark depth) max-mark)                
           min-mark 
           max-mark 
           (inc depth) 
           (dec best-score)))))))

About loop

  • 它不是loop循环:它是recur.
  • loop is a let从而形成一个recur point.
  • 你不会也不能跳出循环: recur将你们合而为一。

loop相当于设置并调用匿名函数。例如

(loop [n 5, s "Hello, world!"]
  (if (zero? n)
    (first s)
    (recur (dec n) (rest s))))

...相当于

((fn [n s]
  (if (zero? n)
    (first s)
    (recur (dec n) (rest s))))
 5 "Hello, world!")

随着一些性能损失,loop可以编写为执行上述转换的宏。


至于你的代码:

这里有六个未定义的函数。为了清除编译,我们

(declare best-min-score 
         best-max-move
         best-min-move
         best-max-move
         make-move-on
         remaining-scores)

还有两种冗余形式。这些不会造成任何主动损害,但会使代码变得模糊。

  • The loop不需要:函数本身是合适的 目标为recur.
  • The do什么都不做:它包含一个单一的表单。

你的函数简化为

(defn minimax [board max-mark min-mark depth best-score] 
  (if (= best-score (best-min-score board max-mark min-mark depth))
    (best-max-move board max-mark min-mark depth)
    (if (= best-score (best-min-score board min-mark max-mark depth))
      (best-min-move board min-mark max-mark depth)              
      (recur 
       (make-move-on board (remaining-scores board max-mark min-mark depth) max-mark)                
       min-mark 
       max-mark 
       (inc depth) 
       (dec best-score)))))

尽管任何未定义的函数都可能重复出现,但最好的选择是best-min-move.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Clojure 中退出 Recur 循环 的相关文章

  • Django中的自动递增值

    我在 django 中有一个表并尝试自动递增它的序列号 在自定义模板中 for 循环用于变量 自定义模板 for i in getodeskview tr td 1 td td i odesk id td td i hours td td
  • 设置、让、宏、坚果

    我正在尝试从 html 内容构建一个快速目录 为了简短起见 代码非常简单 defn toc content doseq i take 5 iterate inc 1 let h str h i println content h where
  • 如何处理数字逻辑模拟器中的循环?

    我正在开发一个数字逻辑模拟器 以便稍后在其中构建我自己的 CPU 所以这是一个长期项目 对于没有循环的电路 例如全加器 一切都非常有效 还有像 SR 锁存器这样的电路 其中一个门的输入连接到另一个门的输出 所以我陷入了循环 因为两个门都需要
  • duckmap 到底有什么作用?

    From 文档 https docs perl6 org routine duckmap duckmap将会应用 block每个元素上并返回一个新列表 其中包含块的已定义返回值 对于未定义的返回值 duckmap如果该元素实现了 将尝试下降
  • Java 增强型 For-Loop 比传统的更快?

    所以我的理解是 增强的 for 循环应该更慢 因为它们必须使用迭代器 但是我的代码提供了混合结果 是的 我知道循环逻辑占用了循环中花费的大部分时间 对于少量迭代 100 1000 增强的 for 循环在使用和不使用 JIT 的情况下似乎都要
  • 在 Mule 3.4 中模拟 while 循环

    我需要在 Mule Flow 中使用 while 循环来从自定义 DAO 中加载数据块 我使用表达式转换器来访问 DAO 直到他不再提供任何项目 我不知道 DAO 提供的项目总量 Mule 3 4 中没有内置 while 循环 我的第一个想
  • do { ... } while (0) — 它有什么用? [复制]

    这个问题在这里已经有答案了 我已经看到这个表情十多年了 我一直在努力思考它有什么好处 因为我主要在 defines 中看到它 所以我认为它对于内部作用域变量声明和使用中断 而不是 gotos 很有用 对其他方面有好处吗 你用它吗 这是 C
  • 是否可以在没有迭代器变量的情况下创建“for”循环? (如何让代码循环一定次数?)

    是否可以在没有以下情况的情况下执行以下操作i for i in range some number do something 如果你只想做某件事N次并且不需要迭代器 从我的头顶上看 不 我认为你能做的最好的事情就是这样 def loop f
  • 递归:n项级数之和

    需要递归函数 系列是 1 2 3 3 4 5 4 5 6 7 递归求 n 的级数之和 我无法想到应该在函数中传递哪些参数 我的方法 我认为我应该传递 n 要相乘的项数 但我无法想到的是我应该如何在同一个函数中 和 以及我的 return 语
  • 如何使用break语句停止内部和外部循环[重复]

    这个问题在这里已经有答案了 我使用的代码非常简单break内部循环 for int it 0 it lt 5 it for int it2 0 it2 lt 5 it2 if it2 2 break break here not it2 b
  • Python脚本递归重命名文件夹和子文件夹中的所有文件

    您好 我有许多不同的文件需要重命名为其他文件 我已经走到这一步了 但我想要拥有它 这样我就可以有许多要替换的项目及其相应的替换项 而不是逐一输入 运行代码然后再次重新输入 更新 另外 我需要重命名以仅更改文件的一部分而不是整个文件 因此如果
  • 我如何在环中模拟 json post 请求?

    我正在使用橄榄石 https github com xeqi peridot https github com xeqi peridot测试我的环应用程序 它工作正常 直到我尝试使用 json 数据模拟 post 请求 require ch
  • 生成一定长度的所有排列

    假设我们有一个字母表 abcdefghiklimnop 如何以有效的方式以五个一组的形式重复该字母表来递归生成排列 几天来我一直在为此苦苦挣扎 任何反馈都会有帮助 本质上这与 生成给定字符串的所有排列 https stackoverflow
  • 为什么我的字符串函数返回 clojure.lang.LazySeq@xxxxxx?

    我使用 leiningen REPL 定义了以下 3 个函数 defn rand int range floor ceiling floor rand int ceiling floor defn mutate index mutates
  • 不区分大小写的 array_unique

    我正在尝试编写几行代码来创建一个不区分大小写的数组唯一类型函数 这是我到目前为止所拥有的 foreach topics as value lvalue strtolower value uvalue strtolower value if
  • Django模型递归关系

    为什么要创建递归关系 aField models ForeignKey self 这和上面的一样吗 class aClass models Model aField models ForeignKey aClass 当您希望父节点和子节点具
  • 内存数据存储中有 Clojure 吗?

    我主要在 Node 中编程 并且喜欢文档存储 但我想首先对客户端和服务器之间的数据调用进行原型设计 我用过lowdb https github com typicode lowdb and da base https github com
  • 如何在 Twig 中渲染树

    我想渲染一棵深度不确定的树 孩子的孩子的孩子等 我需要递归地循环遍历数组 我怎样才能在 Twig 中做到这一点 我玩过domi27的想法 https stackoverflow com questions 8326482 how to re
  • Bash 目录上的 For 循环

    快速背景 ls src file1 file2 dir1 dir2 dir3 Script bin bash for i in src do if d i then echo i fi done Output src dir1 src di
  • 最有效地将编译时大小的数组的所有元素相加

    我正在尝试使用最少量的指令 有效地将所有内容添加到编译时大小的数组中 当然 我正在使用模板 我创造了这个 template

随机推荐