Namaran

Code daily. Without assist.

2026-08-25

fib_memo.c

static int memo[10];
static int calls = 0;

int fib(int n) {
    if (n < 2)
        return n;
    if (memo[n] != -1)
        return memo[n];
    calls++;
    return memo[n] = fib(n - 1) + fib(n - 2);
}

int main(void) {
    for (int i = 0; i < 10; i++)
        memo[i] = -1;
    int result = fib(9);
    printf("%d %d\n", result, calls);
}

これは何を出力するでしょうか?

Answer

34 8(その後に改行)。fib(2)からfib(9)までの8個の値だけがcallsを1つずつ増やして実際に計算されます。一度計算された値はmemo配列に残るので、以降そのnが再び必要になってもcallsを増やさずキャッシュからそのまま返ります。メモ化なしで同じ再帰を書けば呼び出し回数は指数的に増えますが、静的配列でメモ化すると必要な計算はちょうど8回で済みます。