【问题标题】:Recursive function in ClojureClojure 中的递归函数
【发布时间】:2019-05-29 14:18:22
【问题描述】:

我在 java 中编写了一个递归函数,并希望为 Clojure 实现相同的函数。

java代码sn-p如下。

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

【问题讨论】:

  • 我们需要看看实际的功能,这只是一个粗略的草图。
  • 请看这里的资源:@​​987654321@
  • 你试过什么?您具体需要哪些帮助?除了“一些代码”部分之外的所有部分都可以使用cond来实现。
  • 如果您决定修改您的问题,请考虑您当前结构的函数对尾递归不友好,并且不适用于 recur 表单。这可能会让你打开调用堆栈。
  • @Carcigenicate 更好的是,使用or

标签: clojure


【解决方案1】:

一个几乎直接的等价物是

(defn solve [i j]
  (or ;; some other code
      (solve (dec i) j)
      (solve i (inc j))
      ;; some code
      ))

请注意缺少 return 语句 - 一切都是表达式。

在您的 java sn-p 中,“其他代码”必须具有返回真值的能力,否则最终会导致堆栈溢出(代替“无限递归”)。

代码如此短的原因是or 宏会使评估短路(即,一旦可以推断出有意义的结果,它就会停止评估)。

在 clojure 示例中,“一些其他代码”必须是可以评估为 false 或 nil 的表达式。

如果您需要从“其他代码”中“立即返回false”,您的表达式需要更复杂一些。

【讨论】:

  • 我认为你的意思是它必须能够在 JS 中返回 true,并且在 Clojure 中必须能够评估真实的东西,不是吗?如果您在 or 中使用标头,则让标头能够返回 false 并不能帮助您了解基本情况。
  • @amalloy 你说得对,我回答得有点快。我已编辑以反映您的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2011-08-03
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多