【问题标题】:Clojure: How to do basic recursion?Clojure:如何进行基本递归?
【发布时间】:2015-10-17 01:55:57
【问题描述】:

我正在尝试在 tryclj.com 上的 clojure 中编写一个简单的递归函数。

(defn sum-to-n [n]
  (if (<= n 0) n
      (+ n (sum-to-n (- n 1)))))

通过键入(sum-to-n 4) 调用函数会引发异常:

java.lang.IllegalStateException:尝试调用未绑定的 fn:#'sandbox16265/sum-to-n

看起来您甚至无法进行递归函数调用。但是,奇怪的是,即使调用不应触发递归函数调用的(sum-to-n 0),也会引发相同的异常。我做错了吗?

【问题讨论】:

  • tryclj.com 会随机清除所有定义的状态,您只需重新输入定义即可。另外,最好尽可能使用recur(这里适用),但这与此错误无关。
  • 你的函数在lein repl 中对我有用。 tryclj 可能是在试图避免恶意递归。
  • 使用 tryclj.com 对我来说很好。但我知道问题所在:有时基本的东西在 tryclj.com 中似乎随机不起作用。
  • @sloth 我刚刚复制并粘贴了它,它工作了
  • @mikeyhew 我曾经遇到过我创建的地图(def m {:foo :bar} 在函数(some-function m) 中不起作用的问题。我现在大部分时间只是使用本地 REPL。

标签: clojure


【解决方案1】:

tryclj.com 有一个关于它的链接:

此外,如果您定义的内容过多或 15 分钟后,解释器会删除您输入的数据。

如果其他事情没有按预期工作,您应该知道它使用Clojail,这是一个沙盒库,对您可以执行的操作施加了很多限制。正如评论者所说,这在 Clojure repl 或编译程序中运行良好。

您应该检查的其他内容:recur 用于尾递归以避免耗尽您的堆栈,dec/incpos?zero?neg? 以获得更多可读性检查。当然,您知道这个特定的函数不需要是递归的。你可以写成:

 (defn sum-to-n [n]
     (quot (* n (inc n)) 2))

【讨论】:

    【解决方案2】:
    (defn sum-to-n [n]
        (if (= n 1)
            n
            (+ n (sum-to-n (dec n)))))
    

    此代码有效。试试看。

    【讨论】:

      【解决方案3】:

      这是一个 try-clj 问题。我不知道具体是什么。

      (defn f[] 1)

      'sandbox8136/f

      (f) java.lang.IllegalStateException:尝试调用未绑定的 fn:#'sandbox8136/f

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多