gpt4 book ai didi

recursion - clojure 循环/递归

转载 作者:行者123 更新时间:2023-12-04 06:02:28 25 4
gpt4 key购买 nike

我正在尝试学习一些 Clojure。我制作了一个非常基本的 child 游戏“滑梯和梯子”模型。当玩家得分大于或等于 100 时,游戏结束。
现在这只对玩家有效。

以“(play player1)”开始游戏。

我被困在如何让它成为多人游戏,不得不使用递归而不是“foreach”语句。
我怎样才能将其修改为多人游戏?

(defn roll []
(+ 1 (rand-int 6)))

(def chutes { 10 5, 12 3, 55 38, 77 69})
(def ladders { 12 16, 10 25, 20 55, 77 91})

(defn apply_chutes [player]
(if (contains? chutes @player)
(do (reset! player (chutes @player))
(println "down chute! " @player))))

(defn apply_ladders [player]
(if (contains? ladders @player)
(do (reset! player (ladders @player))
(println "up ladder! " @player))))

(defn move [player]
(do(swap! player + (roll))
(println "p: " @player)
(apply_chutes player)
(apply_ladders player)
player))
(if
("done")))

(defn play [player]
(move player)
(if (>= @player 100)
(println "done")
(play player)))

(def player1 (atom 0))

最佳答案

好的,我不会为您提供完整的代码,但会更好地提供关于函数式编程的高级设计,尤其是 Clojure 中的循环/递归。

让我们从函数式编程中一个非常重要的概念开始——不变性 .函数式程序试图避免系统状态的任何改变。程序不是改变状态,而是产生新的状态。例如,如果您有向量 v1 = [1, 2, 3, 4]并想在它的末尾插入 5,你不要破坏 v1 ,而是生产 v2 = [1, 2, 3, 4, 5] ( v1 保持在内存中不变)。见 this有关函数式编程中不变性的更多细节的问题。

有了这个,最好的方法是创建特殊变量 state ,这将保持游戏的整体状态。

接下来要考虑的是 循环 .同样,在函数式编程中,循环概念几乎被 所取代。递归 .循环和递归通常很相似 - 两者都允许您在终止之前多次重复某些代码。在大多数命令式编程语言(例如 Python、Java)中,递归会导致堆栈增长,但在函数式语言中,尾递归的概念非常流行。如果你不熟悉这个概念,我强烈建议你学习它。现在我只想说,尾递归只能发生在尾位置(控制流中的最后一条语句),它不会导致堆栈增长,因此可以用作循环构造。

在 Clojure 中,尾递归是用 recur 组织的关键词:

(defn play [state ...]
...
(recur new-state ...))

在这里,我们定义 play带参数的函数 state并使用关键字 recur 递归调用它在最后一行(我们也可以将其称为 (play new-state ...),但在这种情况下,JVM 不会将代码优化为尾递归)。 new-state定义在函数体的某个地方,完全代表它的意思 - 游戏的新状态。

最后,您想让您的游戏成为多人游戏,即在每次迭代后更改当前玩家。使用循环/递归,只需交换播放器即可轻松实现:
(defn play [state current-player next-player]
;; do play with current-player and compute new-state
(recur new-state next-player current-player))

请注意,在重复调用中,玩家交换了他们的位置,因此下一个玩家成为当前玩家,反之亦然在 play 的新调用中。 .

有了这个,您应该能够将代码转换为新版本。

关于recursion - clojure 循环/递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com