09/03/04 15:42:06
アッカーマン関数の話だけど、
・同じ行では左側(nが小さい方)しかか参照しない
・上(mが小さい方)の列程計算可能な行(n)は多い
なので、再帰を使わずに、表の参照と捉えた方が良い。
そうしないと、同じ枡を何度も無駄に計算する事になる。
List<List<int>> Ack = new List<List<int>>();
とか作って、
const int maxN = 100000;
int m = 0, n = 0;
while (true) {
Ack.Add(new List<int>());
n = 0;
while (true) {
try {
if (n > maxN) throw new Exception();
if (m == 0) {
Ack[m].Add(n + 1);
} else if (n == 0) {
Ack[m].Add(Ack[m - 1][1]);
} else {
Ack[m].Add(Ack[m - 1][Ack[m][n - 1]]);
}
n++;