特定の操作(部族の生成など)を一定時間実行したい。前の反復の出力を次の反復の入力として使用するたびに。
n個の要素のコレクションに対してダミーのreduceを実行することでそれを達成しています。次に、アキュムレータのみを考慮して、コレクションから要素を破棄します。
(defn generate-game [world n-tribes]
(let [ game (create-game world)
game (reduce (fn [acc, _] (:game (generate-tribe acc))) game (repeat n-tribes :just_something))]
game))
それを行うにはもっと良い方法があると思います。それを見つけるのを手伝ってくれませんか。
質問で使用された方法は問題ありませんが、代わりに範囲を使用してください
(defn generate-game [world n-tribes]
(reduce (fn [acc _] (:game (generate-tribe acc)))
(create-game world)
(range n-tribes)))
範囲オブジェクトはそれ自体をインテリジェントに縮小する方法を知っているため、これはループになります。これはreduce
範囲の方法です:
public Object reduce(IFn f, Object start) {
Object ret = f.invoke(start,n);
for(int x = n+1;x < end;x++)
ret = f.invoke(ret, x);
return ret;
}
とにかくゲームの状態がアトムになってしまう場合は、それdotimes
を更新することも検討できます。
(defn generate-game [world n-tribes]
(let [game (atom (create-game world))]
(dotimes [_ n-tribes] (swap! game (comp :game generate-tribe)))
game))
反復も優れたソリューションです。seqを生成せずに、結果に関数を繰り返し適用するでの詳細な説明。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加