0

再帰関数を使用して、(プロジェクトの) 自己回避ランダム ウォークを計算したいと考えています。私は 2 つの配列StepXでそれを行うことができStepY、パスの x と y をそれぞれ追跡します。再帰関数は次のようなものです。

go(int x, int y, int n,int* StepX,int* StepY)

これは、「n 番目のステップでは、(x,y) に移動し、StepX と StepY に行ったことを思い出してください」に要約できます。

プロジェクトは終了し、私は満足していますが、速度を向上させるために、1 と 0 で訪れた/まだ訪れていない場所を表すラティスを (また) 使用して機能させる方法を知りたいと思います。

として機能を拡張することを考えました

go(int x, int y, int n,int* StepX,int* StepY, int* lattice)

go関数が呼び出されるたびに、ラティスの新しいコピーを作成し、それを操作すると思ったので、私が探していたものです。しかし、これは明らかにそうではありません。一方向を探索した後 (および許可された再帰の最大レベルに達した後)、より低いレベルの再帰に進んでも、ラティスはまだ同じであり、訪問した場所 (のより深いレベル) とマークされていますが、再帰の各レベルがラティスの異なるコピーで機能するようにしたかったのです。

それは間違った期待ですか?それは間違った実装ですか?このアプローチで必要なメモリ サイズを減らすためのアドバイスはありますか?

私のコード (実際にはほとんど書いていません) はここにあります: https://gist.github.com/4144833

私は経験豊富なプログラマーではありません。

4

1 に答える 1

2

いいえ、C のパラメーターのルールを誤解しています。再帰呼び出しでコピーされるのは、格子配列自体ではなく、格子へのポインターです。あなたはそれを自分でしなければならないでしょう。

最も簡単な方法は、呼び出しの開始時に新しい配列を ( を使用してmalloc) 割り当て、 を使用してデータをコピーし、再帰呼び出しの最後に配列をmemcpyコピーすることです。free

于 2012-11-25T19:47:09.590 に答える