Rekurzija. 8)
Uzmes polje [tt]niz[/tt] (globalno ili parametar rekurzije) duljine 10 koje na [tt]i[/tt]-tom mjestu ima [tt]k[/tt] ako je znamenka [tt]i[/tt] jedna od tih koje zelis, a inace ima [tt]0[/tt]. :-s Npr. za tvoj primjer, polje je
:nosmile: [tt]{0,2,0,2,0,0,0,0,0,2}[/tt] (ako sam dobro brojao O:))
U rekurziji imas petlju u kojoj neki [tt]i[/tt] ide od 0 do 9:
- Ako je [tt]niz[i] > 0[/tt], onda dodajes znamenku [tt]i[/tt] na kraj broja (broj je parametar funkcije, ergo lokalna varijabla), smanjujes [tt]niz[i][/tt] za jedan i pozivas rekurziju. 8) Kad izadjes van iz rekurzije, povecavas [tt]niz[i][/tt] za jedan i - ako je potrebno - vracas staru vrijednost broja, te ides na iduci korak petlje. 8)
- Ako uvjet u petlji nije ni jednom ispunjen (tj. [tt]niz[i] == 0[/tt] za sve [tt]i[/tt]), onda ispises broj. :)
Ovako nekako:
[code:1]void brojevi(unsigned long int br; int *niz) {
int i, flag = 0;
for (i = 0; i < 10; i++)
if (niz[i] > 0) {
flag = 1;
niz[i]--;
brojevi(10 * br + i, niz);
niz[i]++;
}
if (!flag) printf("%lu\n", br);
}[/code:1]
Prilikom poziva iz [tt]main()[/tt]-a, [tt]niz[/tt] mora biti inicijaliziran onako kako sam opisao, a [tt]br[/tt] mora biti nula. 8)
As always, ovo pisah napamet, pa su moguce greske i propusti. :blush:
P.S. Algoritam se lako prilagodi i tako da smijes imati nule u pocetnom nizu, ali to prepustam tebi. :xg:
Rekurzija.
Uzmes polje niz (globalno ili parametar rekurzije) duljine 10 koje na i-tom mjestu ima k ako je znamenka i jedna od tih koje zelis, a inace ima 0. Npr. za tvoj primjer, polje je
{0,2,0,2,0,0,0,0,0,2} (ako sam dobro brojao )
U rekurziji imas petlju u kojoj neki i ide od 0 do 9:
- Ako je niz[i] > 0, onda dodajes znamenku i na kraj broja (broj je parametar funkcije, ergo lokalna varijabla), smanjujes niz[i] za jedan i pozivas rekurziju. Kad izadjes van iz rekurzije, povecavas niz[i] za jedan i - ako je potrebno - vracas staru vrijednost broja, te ides na iduci korak petlje.
- Ako uvjet u petlji nije ni jednom ispunjen (tj. niz[i] == 0 za sve i), onda ispises broj.
Ovako nekako:
Kod: | void brojevi(unsigned long int br; int *niz) {
int i, flag = 0;
for (i = 0; i < 10; i++)
if (niz[i] > 0) {
flag = 1;
niz[i]--;
brojevi(10 * br + i, niz);
niz[i]++;
}
if (!flag) printf("%lu\n", br);
} |
Prilikom poziva iz main()-a, niz mora biti inicijaliziran onako kako sam opisao, a br mora biti nula.
As always, ovo pisah napamet, pa su moguce greske i propusti.
P.S. Algoritam se lako prilagodi i tako da smijes imati nule u pocetnom nizu, ali to prepustam tebi.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|