Namaran

Code daily. Without assist.

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つを見分けておくと、後で仕様を変える(例えば負の数を許すなど)ときにどちらを直すべきかが分かりやすくなります。これは参考実装であり、唯一の正解ではありません。