Namaran

Code daily. Without assist.

2026-09-18

step_down.c

#include <stdio.h>

int f(int n) {
    if (n == 0)
        return 100;
    if (n < 0)
        return -1;
    return n + f(n - 2);
}

int main(void) {
    printf("%d\n", f(5));
}

fには基底ケースが2つあります。f(5)は何を出力するでしょうか?

Answer

8(その後に改行)。nは5, 3, 1, -1と2ずつ減っていくので、n == 0という最初の基底ケースには一度も一致しません。nが奇数から始まる限り、その基底ケースはそもそも到達不可能です。実際に再帰を止めるのは2つ目の基底ケースn < 0で、f(-1)-1を返した時点で止まります。あとは各呼び出しが加算した値を戻り値として積み上げるだけなので、5 + 3 + 1 + (-1) = 8になります。基底ケースは「これがあれば止まる」ではなく、「再帰のたどる値に対して実際に一致するか」まで確認する必要があります。