/*
    binarni.c

    Program rekurzijom ispisuje binarne nizove zadane duljine. Unese se duljina niza
    i ispisuju se svi koji se mogu dobiti.

    Npr., za n=3 treba ispisati (redoslijed nije bitan):
    000
    001
    010
    011
    100
    101
    110
    111
*/

#include <stdio.h>

#define nznam 2

char niz[100];
int n;

void ispis(int j) {
/*
    Ova funkcija odvrti for petlju u kojoj postavlja j-tu znamenku
    niza redom na 0,1,...,nznam-1. Kad postavi znamenku, pozove sama
    sebe s argumentom j+1, kako bi se postavila sljedeca znamenka.

    Kad j postane jednako n, znaci da smo postavili sve znamenke pa
    ispisujemo niz i prekidamo rekurziju.

    Kao sto znamo, kad se unutar funkcije a pozove funkcija b, funkcija
    a se trenutno prekida dok se ne izvrsi b, a zatim se nastavlja.
    S '->' je oznacen poziv nove funkcije, a s '--' nastavak vec pokrenute.

    Evo kako to otprilike izgleda za n=3:

                                     niz[]   0.  1.  2.  3.  4.
    -> main
        -> ispis(0)                          0           (ovdje dakle postavljamo niz[0] na 0)
            -> ispis(1)                      0   0
                -> ispis(2)                  0   0   0
                    -> ispis(3)              j==n, ispisujemo 000, izlazimo iz ispis(3)
                -- ispis(2)                  0   0   1
                    -> ispis(3)              j==n, ispisujemo 001, izlazimo iz ispis(3)
                -- ispis(2)                  for petlja je zavrsena, izlazimo iz ispis(2)
            -- ispis(1)                      0   1
                -> ispis(2)                  0   1   0
                    -> ispis(3)              j==n, ispisujemo 010, izlazimo iz ispis(3)
                -- ispis(2)                  0   1   1
                    -> ispis(3)              j==n, ispisujemo 011, izlazimo iz ispis(3)
                -- ispis(2)                  for petlja je zavrsena, izlazimo iz ispis(2)
            -- ispis(1)                      for petlja je zavrsena, izlazimo iz ispis(1)
        -- ispis(0)                          1
            -> ispis(1)                      1   0
                -> ispis(2)                  1   0   0
                    -> ispis(3)              j==n, ispisujemo 100, izlazimo iz ispis(3)
                -- ispis(2)                  1   0   1
                    -> ispis(3)              j==n, ispisujemo 101, izlazimo iz ispis(3)
                -- ispis(2)                  for petlja je zavrsena, izlazimo iz ispis(2)
            -- ispis(1)                      1   1
                -> ispis(2)                  1   1   0
                    -> ispis(3)              j==n, ispisujemo 110, izlazimo iz ispis(3)
                -- ispis(2)                  1   1   1
                    -> ispis(3)              j==n, ispisujemo 111, izlazimo iz ispis(3)
                -- ispis(2)                  for petlja je zavrsena, izlazimo iz ispis(2)
            -- ispis(1)                      for petlja je zavrsena, izlazimo iz ispis(1)
        -- ispis(0)                          for petlja je zavrsena, izlazimo iz ispis(0)
    -- main                                  main funkcija gotova, gotov program
		   
*/
    int i;

    /* Uvjet za prekid rekurzije */
    if (j==n) {
        printf("%s\n",niz);
        return;
    }

    /* Ovo je for petlja koja vrti znamenke koje se postavljaju na j-to mjesto */
    for (i=0;i<nznam;i++) {
        niz[j]=i+'0';
        ispis(j+1);
    }
}

int main(void) {
    printf("Unesi n: ");
    scanf("%d",&n);

    /* Poziv funkcije ispis za postavljanje nulte znamenke, ona sama poziva
       sebe za postavljanje ostalih znamenki. */
    ispis(0);

    return 0;
}
