2013-10-11 75 views
1

我的目標是迭代我寫的函數,任意調用大猩猩j次。大猩猩以序列作爲參數。但是,代碼充滿了錯誤(不是故意的),並且返回鍵必須是整數。循環先前定義的函數

下面是代碼的副本:

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

回答

1

這種事情是什麼迭代是最有用的。

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

所以這種情況下,你會想:

(nth (iterate gorilla seq) j)

+2

你可以用'(第n ...)',而不是'(最後一個(帶...) )'。 –

+0

不錯的建議,編輯! – noisesmith

0

在你的代碼的問題是,你在你的循環結合的名稱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)))) 
0

的問題是你在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))))))