0

私はPythonを独学しようとしていますが、再帰になると大まかな場所にぶつかりました。私は古典的な再帰関数 (階乗、フィボナッチ数...) を実行しましたが、古いコードに戻って、反復関数のほとんどを練習のために再帰関数に変換しようとしています。

これは私がぶつかった壁です:

しばらく前にダンジョンクローラーを作成しましたが、スプライトの近くの正方形を表示するために使用した for ループを置き換えようとしています。したがって、スプライトが配置されると、自分がいるタイルと、隣接する対角線の正方形 (アバターがいるタイルを含めて合計 9 個) が表示されます。部屋を構成する他のタイルは非表示になります。これをビューの半径 1 と見なしました。ビューの半径 2 については、チャーに半径 1 の正方形と、それらのタイルに隣接するすべてのタイルを表示させたいと考えました。当時、for ループでそれを行う方法を理解できなかったので、より単純なスキームを実装しました。

この可視性関数は再帰的に記述できると思いますが、基本的なケースと再帰的なステップを考えるのに苦労しています。私の for ループは、アバターの位置を取り、アバターの位置 + 半径までの範囲で反復処理を行い、x、y 座標に対してそれを行いました。

これを再帰関数に変換する限り、私は本当に混乱しています。私は手がかりを得ようとして多くの検索を行ってきましたが、次のような複雑な主題しか思いつきませんでした。

どんな助けでも大歓迎です。

4

2 に答える 2

1

再帰を言葉で表現すると、多くのことが役立つことがわかりました。アルゴリズムが言うことは、基本的に「半径 N で見えるものは、半径 N-1 から見えるものである」ということです。エッジが大きくなります。

于 2012-10-13T03:02:41.497 に答える
0

このようなものはどうですか:

def visible(pos, radius, seen):
    if radius == 1:
        # base case
        seen.add(...)
        yield ...
    else:
        for center in visible(pos, radius-1, seen):
            for x in visible(center, 1, seen):
                if x not in seen:
                    seen.add(x)
                    yield x

seenになりますset。「外部から」呼び出すたびにvisible、空のセットを提供します。

visible(pos, radius, set())

このseenセットは、fog of war (または少なくとも奇妙に見えない正方形 ;) を実装するように初期化することもできます...

于 2012-10-12T21:54:34.213 に答える