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);
}