我用Java编写了一个递归函数,并希望为Clojure实现相同的功能。
下面是Java代码段。
private boolean solve(int i, int j) {
// some other code
if ((solve(i - 1, j)) == true) {
return true;
}
if ((solve(i, j + 1)) == true) {
return true;
}
// some code!!!!
return false;
}
如何在Clojure中实现?
答案 0 :(得分:1)
几乎直接等同于
(defn solve [i j]
(or ;; some other code
(solve (dec i) j)
(solve i (inc j))
;; some code
))
请注意,缺少return
语句-一切都是表达式。
在您的Java代码段中,“其他一些代码”必须具有返回true的能力,否则最终将导致堆栈溢出(代替“无尽的递归”)。
代码之所以如此简短,是因为or
宏使评估短路(即,一旦得出有意义的结果,它将立即停止评估)。
在clojure示例中,“其他代码”必须是一个可以评估为false或nil的表达式。
如果您需要从“其他代码”中“立即返回false
”,您的表达式需要更加复杂。