此问题与StackOverFlow while counting digits直接相关。我已经解决了这个问题的解决方案,并提出了两个问题:
首先是解决方案:
(defn num-digits-tail-recursion
([n count]
(if (= 0 n)
count
(recur (quot n 10) (inc count))))
([n] (num-digits-tail-recursion n 0)))
count是一个独立的函数,用于计算字符串中的字符数。我是否正确假设计数被允许为var,因为它不在列表的第一个位置?
count是第二个参数,但我只传递一个参数 - 数字。
有关以列表开头的函数语法有什么特别之处,而不是
典型的参数向量(defn test_fn [x y] (println x))
?
我为原始问题的不清晰而道歉。为什么提供函数名称 - count - 不会导致num-digits-tail-recursion期望第二个参数?如果我提供([n x]...
而不是(n count]...
并使用一个参数调用该函数,则会出现一个不足参数错误。
答案 0 :(得分:2)
使用与引用的命名空间中的现有函数相同的函数命名args并不是一个好主意,尽管在您的示例中,count以这种方式使用而不是。在您的示例中,count只是一个在每次递归迭代中递增的int!
但是如果你想传递一个count函数并且你将它的名字命名为'count',那么将调用什么函数?函数clojure.core/count
或传递的函数? (整改:由于词法范围而传递的函数)。因此,避免混淆并选择不同的名称。即使您没有传递函数,也应该避免使用这些名称。
函数支持arity重载,这就是您现在使用的内容。请阅读:http://clojure.org/functional_programming
答案 1 :(得分:1)
问题#1:Clojure是lexicaly范围。因此,如果您创建一个与在封闭范围内定义的var同名的本地var,则本地副本将会影响'外面的。在这种情况下,clojure.core中的count
是外部范围,此函数的count
将覆盖它。当您在此函数中引用count
时,您会看到本地函数参数列表中的定义。
(def x 4)
(defn foo [x]
(println x))
(foo 42)
=> 42
在您的特定情况下count
在不同的命名空间中定义,但范围概念是相同的。
第2部分的例子:
(defn foo
([] (println "i have no args"))
([x] (println "i have one arg " x))
([x y] (println "i have two args " x " " y)))