Namaran

Code daily. Without assist.

2026-09-18

countdown.c

#include <stdio.h>

void countdown(int n) {
    if (n == 0) {
        printf("done\n");
        return;
    }
    printf("%d\n", n);
    countdown(n - 2);
}

int main(void) {
    countdown(5);
}

countdown(5)5, 3, 1を出力したあと"done"で止まるはずですが、実際には止まりません。何が問題で、どう直せばよいでしょうか?

Answer

基底ケースはn == 0という等値の一致だけを見ていますが、nは5から2ずつ減っていくので、5, 3, 1, -1, -3, ...と奇数の値しか取らず、0には一度も一致しません。基底ケースそのものは正しく書かれていても、再帰が実際にたどる値の並びと一致するとは限らない、という例です。この呼び出しはスタックオーバーフローするまで再帰し続けます。等値ではなく範囲で判定するように直せば、nがどのステップ幅で減っても必ず一致します:

void countdown(int n) {
    if (n <= 0) {
        printf("done\n");
        return;
    }
    printf("%d\n", n);
    countdown(n - 2);
}