アカウント名:
パスワード:
今のソースコードは、ゲームを進めていくと突然ゲームが落ちるバグがあります。
原因は Main() の内部で Main() を呼び出しているからです。ある関数Xの内部から関数X自身を呼び出す方法を「再帰呼び出し」といいますが再帰呼び出しが出来る回数には上限があります
たとえば
static int count = 0;static void Main(){ count++; Console.WriteLine("count: {0}", count); Main();}
これを実行するとプログラムがクラッシュします多分デフォルトのC#環境なら count の値が10000ぐらいになると落ちると思います(手元にC#環境
末尾呼び出しや末尾再帰は、処理系によっては最適化されて、ただのジャンプやループに変換されるから、必ずしもスタックオーバーフローが起きるわけではない。C#の場合はx64でリリースビルドなら末尾最適化があるらしい。gcc(C++)だったら、末尾呼び出しの最適化があったので、それを利用したプログラムを作ったことはある。
まあ、使える条件がかなり限定的なので、普通は使わないほうが良いと思うが、使える場合はコードがシンプルになり、実行速度も速い。
再帰はまあ使えばいいと思う。メイン関数を再帰呼び出しするのはやめたほうがいいと思う。単純に紛らわしいしいわゆる初期化処理を何度も実行するはめになる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
犯人は巨人ファンでA型で眼鏡をかけている -- あるハッカー
一つバグがある (スコア:0)
今のソースコードは、ゲームを進めていくと突然ゲームが落ちるバグがあります。
原因は Main() の内部で Main() を呼び出しているからです。
ある関数Xの内部から関数X自身を呼び出す方法を「再帰呼び出し」といいますが
再帰呼び出しが出来る回数には上限があります
たとえば
static int count = 0;
static void Main()
{
count++;
Console.WriteLine("count: {0}", count);
Main();
}
これを実行するとプログラムがクラッシュします
多分デフォルトのC#環境なら count の値が10000ぐらいになると落ちると思います
(手元にC#環境
Re:一つバグがある (スコア:0)
末尾呼び出しや末尾再帰は、処理系によっては最適化されて、ただのジャンプやループに変換されるから、必ずしもスタックオーバーフローが起きるわけではない。C#の場合はx64でリリースビルドなら末尾最適化があるらしい。gcc(C++)だったら、末尾呼び出しの最適化があったので、それを利用したプログラムを作ったことはある。
まあ、使える条件がかなり限定的なので、普通は使わないほうが良いと思うが、使える場合はコードがシンプルになり、実行速度も速い。
Re: (スコア:0)
再帰はまあ使えばいいと思う。メイン関数を再帰呼び出しするのはやめたほうがいいと思う。
単純に紛らわしいしいわゆる初期化処理を何度も実行するはめになる。