Namaran

Code daily. Without assist.

2026-09-13

print_digits.c

#include <stdio.h>

static void forward(unsigned n)
{
    if (n >= 10)
        forward(n / 10);
    putchar('0' + n % 10);
}

static void backward(unsigned n)
{
    putchar('0' + n % 10);
    if (n >= 10)
        backward(n / 10);
}

int main(void)
{
    forward(1203);
    putchar(' ');
    backward(1203);
    putchar('\n');
}

forwardbackwardの違いはputcharを再帰呼び出しの前に置くか後に置くかだけです。これは何を出力するでしょうか?

Answer

1203 3021(その後に改行)。forward(1203)は出力する前にforward(120)forward(12)forward(1)と潜り、一番深い呼び出しから戻る順に1203を出します。backwardは潜る前に出力するので、下の桁から3021です。n % 10で取れるのは常に一番下の桁なのに、配列に溜めて逆順にする処理を書かなくても上の桁から出力できるのは、呼び出しスタックがその「溜めて逆順に取り出す」役を黙って引き受けているからです。