より多くのメモリを許可し、多くの再帰でスタックオーバーフローを回避する方法の複製?
再帰関数で 10000 レベル以上の分枝限定アルゴリズムを書いていますが、スタック オーバーフロー エラーで動作しません。C++ での私のプログラムの簡単な例を次に示します。
void f(int k)
{
if(k==10000) return;
f(k+1);
}
void main()
{
f(1);
return;
}
誰か助けてくれませんか?
これはリンカーの問題です。スタックに割り当てられるメモリの量を増やすようにリンカに指示する必要があります。これは、言語やコンパイラによって異なります。これは、コマンド ライン パラメータ、構成ファイル、またはソース コードで指定することもできます。
Linux (おそらく Mac も?) を使用している場合は、ulimit コマンドを使用できます。
しかし、アルゴリズムの最適化や末尾再帰を調べたいと思うかもしれません。
再帰アルゴリズムは、リストを使用して非再帰アルゴリズムに書き換えることができます。このようにして、問題をスタック サイズからヒープ サイズに移動しました。通常、ヒープはスレッド スタックよりも (はるかに) 大きくなります。コンパイラ/リンカーとプラットフォームに応じて、スタック サイズ リンカー フラグもあります。
または、再帰を相互関係に書き直すことができます。
主な質問に加えて、Valgrind とそのツール Massif を使用して、スタック消費メモリをプロファイリングすることもできます (Massif はデフォルトでヒープをプロファイルしますが、オプションがオンになっている場合はスタックをプロファイリングすることもできます)。
_beginthreadex を使用すると、スタック サイズを指定できます。デフォルトは1MBだと思います。新しいスレッドをスピンオフして作業を行い、必要なスタック サイズを指定できます。