第5講 メソッド(1)
第3話 2人の社員がお互いに仕事を依頼し合うとどうなる?
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
f(); //社員f()に仕事を命じている。
}
static void f()
{
Console.WriteLine("こんにちは!");
g(); //社員g()に仕事をお願いしている。
}
static void g()
{
Console.WriteLine("今日は良い天気ですね。");
f(); //社員f()に仕事をお願いしている。
}
}
}
とすると、
が続いた後、
とエラーしてしまいます。
このようなときはプログラムの終了を押して下さい。
途中でエラーしてしまった原因は、
このプログラムだと無限ループになってしまうからです。
私の実験によると、
仕事の依頼は4700回程度
(正確には覚えていませんし、これはC++の場合です。
C#の場合も似たようなものだと思います。)
が上限なのです。
その上限回数をこのプログラムだとあっという間に超えてしまします。
なぜ無限ループになってしまうのかと申しますと、
ちょうど鏡を平行に置くと無限に鏡が映し出されるのと同じ状態だからです。
f()→g()→f()→g()→f()→g()→・・・
ですね。仕事の依頼が無限に連鎖してしまいます。
無限ループは、プログラミングにおいては宿痾です。
ただし、すでにアプリやソフトと名付けたプログラムにおいては、
意図的に無限ループを利用していますし、
ゲームプログラミングは基本的に無限ループを使います。
この例外を除いては、無限ループとの戦いがプログラミングであるといっても、
決して大げさとはいえないほど、
うっかりすると無限ループの罠にはまってしまうことがあるのです。
エラーしないようにするには、
回数をカウントする変数を導入します。
プログラムソースを次のように変更して下さい。
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
f(0); //社員f()に仕事を命じている。
}
static void f(int k)
{
k++;
Console.WriteLine("こんにちは!");
g(k); //社員g()に仕事をお願いしている。
}
static void g(int k)
{
Console.WriteLine("今日は良い天気ですね。");
if (k < 5) f(k); //社員f()に仕事をお願いしている。
}
}
}
実行画面
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
ちょうど5回表示してプログラムが終わりました。