2026-09-18
is_power_of_two.c
#include <stdbool.h>
bool is_power_of_two(unsigned n) {
// write this: recursively decide whether n is a power of two
// (1, 2, 4, 8, ...). n == 0 is not a power of two.
}
is_power_of_twoを再帰で実装してください。nが偶数ならn / 2に対して同じ問いを繰り返せることを使うこと。
Reference
#include <stdbool.h>
bool is_power_of_two(unsigned n) {
if (n == 0)
return false;
if (n == 1)
return true;
if (n % 2 != 0)
return false;
return is_power_of_two(n / 2);
}
基底ケースが2つあるのは偶然ではありません。n == 1は再帰の目的である「これ以上割れない、2の累乗の終着点」を表す本来の基底ケースです。一方n == 0は、答え自体は自明(2の累乗ではない)なのに、これを省くと0 / 2が永遠に0のままで再帰が終わらなくなってしまう、別の理由で必要な基底ケースです。この2つを見分けておくと、後で仕様を変える(例えば負の数を許すなど)ときにどちらを直すべきかが分かりやすくなります。これは参考実装であり、唯一の正解ではありません。