1

我的目标是迭代我写的一个函数,任意称为 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))))))  
4

3 回答 3

1

这种事情是迭代最有用的。

(last (take 5 (iterate inc 0)))=> 4

所以对于这种情况,你会想要:

(nth (iterate gorilla seq) j)

于 2013-10-11T10:17:02.120 回答
0

问题在于你gorillarecur调用中的使用。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))))))
于 2013-10-11T03:13:48.697 回答
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))))
于 2013-10-11T03:11:52.030 回答