在Clojure中停止递归

时间:2014-10-22 20:06:20

标签: recursion clojure conditional

我创建了这个排名板功能。它需要一块板,对它进行排名,使得下一步行动并重现。如何在电路板满时停止复发?当没有移动时,make-move-on-board功能会中断,我得到一个Key必须是整数错误。

 (defn rank-boards [board max-mark min-mark depth]
  (cond
    (r/game-in-progress? board max-mark min-mark) in-progress-score
    (r/tie? board max-mark min-mark) tie-score
    (r/winner? board max-mark min-mark)       highest-score)
  (recur 
    (b/make-move-on board (next-space board max-mark min-mark depth) max-mark) 
       min-mark 
       max-mark
       (inc depth)))

1 个答案:

答案 0 :(得分:2)

假设一个名为is-full?的函数在停止递归时返回一个truthy值,并且你想要的返回值是得分:

(defn rank-boards [board max-mark min-mark depth]
 (if (r/is-full? board)

   ;; board is full, so we return the score
   (cond
     (r/game-in-progress? board max-mark min-mark) in-progress-score
     (r/tie? board max-mark min-mark)              tie-score
     (r/winner? board max-mark min-mark)           highest-score)

   ;; board is not yet full, so we recurse
   (recur
     (b/make-move-on board (next-space board max-mark min-mark depth) max-mark) 
        min-mark 
        max-mark
        (inc depth)))

该代码最初抛弃了cond的结果 - 这不是一个特别明智的操作。