は、次のコードを考えてみましょう:再帰メモリを効率的かつ高速に実行する際にグローバル変数を宣言しますか?
int main() {
int ar[100]={0};
int n = 100;
recurFun(ar, n);
return 0;
}
void recurFun(const int ar[], int n) {
if(some condition) {
//some code here to manipulate ar[]...
return ;
}
int i;
//some code to manipulate i
recurFun(ar, i)
}
私は再帰関数は独自の変数、それは自分自身を呼び出すたびに行うことを聞いて、ので、私はar
が何度も作成され、メモリ使用量の多くを要するかもしれない期待します、右?
私は以下のように、グローバルな配列としてar
を宣言した場合:これは、より多くのメモリ効率的なのでしょう
int ar[100]={0};
int main() {
int n = 100;
recurFun(n);
return 0;
}
void recurFun(int n) {
if(some condition) {
//some code here to manipulate ar[]...
return ;
}
int i;
//some code to manipulate i
recurFun(i)
}
?私は、再帰関数がグローバル変数を複製する理由はないと思います。しかし、は、多くの再帰関数が同じ配列を訪問しているため、これは遅くなります。したがって、オーバーヘッドが発生します。
生の配列は値渡しできません。仮引数の宣言 'const int ar []'は 'int const * ar'の記述と同じです。ポインタだけが渡されます。 –
少しでもOT:あなたの関数は[tail-recursive](https://en.wikipedia.org/wiki/Tail_call)なので、良いコンパイラの最適化があれば、本当の再帰が起こることはないでしょう。コピー(ポインタまたはiの場合でも)。 – Holt