1

私の目標は、任意にゴリラと呼ばれる、私が書いた関数を j 回反復することです。Gorilla はシーケンスを引数として取ります。ただし、コードには (意図的ではなく) エラーが多く、返されるキーは整数でなければなりません。

コードのコピーを次に示します。

(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

この種のことは、 iterate が最も役立つものです。

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

したがって、この場合は次のようにします。

(nth (iterate gorilla seq) j)

于 2013-10-11T10:17:02.120 に答える
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 に答える
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 に答える