Clojure中的递归函数

时间:2019-05-29 14:18:22

标签: clojure

我用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中实现?

1 个答案:

答案 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”,您的表达式需要更加复杂。