08/02/08 17:02:37
がーん、ソース貼られてたw しかも、m=2についても解いてあるし。
>>67
>呼び出し回数は大して減らないって?
だから、>54の問題にあるようなキャッシュについてですがな。
m=1について解いてしまえば早くなりましたがな。
癪だから以下に。
--
#include <stdio.h>
#include <stdlib.h>
// #include <stdbool.h>
static int ack(unsigned m, unsigned n)
{
// static int a[4][16];
// bool inRange = m < sizeof(a) / sizeof(* a) && n < sizeof(* a) / sizeof(** a);
int val;
// if (inRange && a[m][n] != 0) return a[m][n];
if (m == 0) {
val = n + 1;
} else if (m == 1) { // short cut for ack(1, n)
val = n + 2; // ack(1, n) -> ack(0, ack(1, n-1)) -> ack(1, n-1) + 1
} else if (n == 0) {
val = ack(m - 1, 1);
} else {
val = ack(m - 1, ack(m, n - 1));
}
// if (inRange) a[m][n] = val;
return val;
}
コメント部分を生かせばキャッシュされるけど、最早どうでもいいなぁw