我的目標是迭代我寫的函數,任意調用大猩猩j次。大猩猩以序列作爲參數。但是,代碼充滿了錯誤(不是故意的),並且返回鍵必須是整數。循環先前定義的函數
下面是代碼的副本:
(defn gen-gorilla [seq j]
(loop [level j gorilla seq]
(if (= level 0)
seq
(if (> level 0)
(recur (- level 1) (gorilla seq))))))
我的目標是迭代我寫的函數,任意調用大猩猩j次。大猩猩以序列作爲參數。但是,代碼充滿了錯誤(不是故意的),並且返回鍵必須是整數。循環先前定義的函數
下面是代碼的副本:
(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
,但這意味着調用gorilla
指的是最新的序列,而不是功能。
這實際上可以很好地寫有減少
(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))))
的問題是你在recur
通話使用的gorilla
。在這種情況下,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))))))
你可以用'(第n ...)',而不是'(最後一個(帶...) )'。 –
不錯的建議,編輯! – noisesmith