我的目标是迭代我写的一个函数,任意地称为gorilla,j次。大猩猩将序列作为参数。但是,代码中存在错误(非故意),并且返回键必须是整数。
以下是代码的副本:
(defn gen-gorilla [seq j]
(loop [level j gorilla seq]
(if (= level 0)
seq
(if (> level 0)
(recur (- level 1) (gorilla seq))))))
答案 0 :(得分:1)
这种事情是迭代最有用的东西。
(last (take 5 (iterate inc 0)))
=> 4
所以对于这种情况你需要:
(nth (iterate gorilla seq) j)
答案 1 :(得分:0)
您的代码中的问题是您在循环中绑定名称gorilla
,但这意味着调用gorilla
引用最新的序列,而不是函数。
这实际上可以很好地用reduce
编写 (defn apply-gorilla [n s]
(reduce (fn [s _] (gorilla s)) s (range n)))
这基本上会循环到n
并忽略n
,只需反复重复应用gorilla
。
如果你真的想要显式递归
(defn apply-gorilla [n s]
(if (zero? n)
s
(recur (dec n) (gorilla s))))
答案 2 :(得分:0)
问题在于您在gorilla
电话中使用recur
。在这种情况下,gorilla
是一个集合,在loop
语句中定义,当您将它们用作函数时,它们等同于索引它们。
([1 2 3] 0) ;; => 1
但是,您将序列作为索引传递给集合。
([1 2 3] [1 2 3]) ;; => Exception: Key must be integer
根据您的说明,您试图调用您在其他位置定义的函数gorilla
。您需要将loop
语句中定义的var重命名为以下内容:
(defn gen-gorilla [seq j]
(loop [level j s seq]
(if (= level 0)
s
(if (> level 0)
(recur (- level 1) (gorilla s))))))