我的目标是迭代我写的一个函数,任意称为 gorilla,j 次。Gorilla 将序列作为参数。但是,代码充满了错误(不是故意的),并且返回的 key 必须是一个整数。
这是代码的副本:
(defn gen-gorilla [seq j]
(loop [level j gorilla seq]
(if (= level 0)
seq
(if (> level 0)
(recur (- level 1) (gorilla seq))))))
这种事情是迭代最有用的。
(last (take 5 (iterate inc 0)))
=> 4
所以对于这种情况,你会想要:
(nth (iterate gorilla seq) j)
问题在于你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))))))
您的代码中的问题是您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))))