Clojure 2024 年状态调查! 中分享您的想法。

欢迎!有关如何操作的更多信息,请参阅关于 页面。

0
Clojure
编辑

我正在学习 clojure,这是我使用该语言的第二天,正在编写一些简单的函数。

(defn fib_effi
[n]
(cond (= n 0) 0
      (= n 1) 1
     :else ((defn fib_iter [i fibi_n_prev fibi_n]
               (if (= i n) fibi_n
                   (fib_iter (+ i 1) fibi_n (+ fibi_n fibi_n_prev))))
             (fib_iter 1 0 1))))
(fib_effi 3)

我收到了以下错误信息

  1. 未处理的 clojure.lang.ArityException

    chapters.core/fib-effi/fib-iter--6404

我是否遗漏了什么?

1 个回答

+2

选择
 
最佳答案

首先,defn(和def)总是生成全局、顶级名称到值的绑定,因此您永远不应该在其他defn(或def)内部使用它们。

其次,您有

(
 (defn fib_iter ...)
 (fib_iter ...)
)

《( ..)》定义了一个函数调用,因此您有第一个元素(即《(defn ..)》的形式),然后作为函数调用第二个元素(《(fib_iter ..))的形式),传递给函数。但是,fib_iter 被声明为需要三个参数(《i`、`fibi_n_prev`、`fibi_n`), 而实际上您只传递了一个参数。

您应该使用《let》进行局部绑定,因此您会有《(let [fib_iter (fn [i fibi_n_prev fibi_n] .. )] (fib_iter 1 0 1))》并且您会发现这将有效。

...