循环先前定义的函数

时间:2013-10-11 02:50:19

标签: clojure lisp

我的目标是迭代我写的一个函数,任意地称为gorilla,j次。大猩猩将序列作为参数。但是,代码中存在错误(非故意),并且返回键必须是整数。

以下是代码的副本:

(defn gen-gorilla [seq j]
  (loop [level j gorilla seq]
    (if (= level 0)
      seq
      (if (> level 0)
        (recur (- level 1) (gorilla seq))))))  

3 个答案:

答案 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))))))