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

欢迎!请查阅关于页面了解本站如何运作的更多信息。

0
头像 Clojure
编辑

我在学习Clojure,这是我使用这个语言的第2天,正在编写一些简单的函数

(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
    将参数数量不正确(传了1个参数)传给了
    chapters.core/fib-effi/fib-iter--6404

我遗漏了什么吗?

1 个答案

+2
头像
选中回答
 
最佳回答

首先,《defn》(以及《def》)始终产生全局、顶级的将名称绑定到值的绑定,您不应该在另一个《defn》(或《def》)中使用它们。

其次,您有

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

括号( .. )用于表示函数调用,因此第一个元素(即(defn .. )形式)是一个函数,随后调用这个函数,其参数是第二个元素(即(fib_iter .. )形式)。但是,fib_iter声明的功能需要三个参数(ifibi_n_prevfibi_n),而您实际上只传了一个参数。

您应该使用let进行局部绑定,因此您可以这样写:(let [fib_iter (fn [i fibi_n_prev fibi_n] .. )] (fib_iter 1 0 1))。您会发现这将工作。

...