Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

permutacije
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
Gost






PostPostano: 17:46 pon, 29. 8. 2005    Naslov: permutacije Citirajte i odgovorite

kako bi izgledala rekurzivna funkcija koja bi za dani broj n ispisala sve permutacije skupa {1,...,n}?
kako bi izgledala rekurzivna funkcija koja bi za dani broj n ispisala sve permutacije skupa {1,...,n}?


[Vrh]
ahri
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07)
Postovi: (193)16
Sarma = la pohva - posuda
= 7 - 0

PostPostano: 22:27 pon, 29. 8. 2005    Naslov: Citirajte i odgovorite

evo cijeli kod

[code:1]#include <stdio.h>
#include <string.h>

#define MAX 10

int bio[MAX];
int polje[MAX];

void rek(int p, int n) {
int i;
if (p==0) { /* ako smo popunili polje, ispisi ga! */
for (i=0;i<n;i++)
printf("%d ", polje[i]+1);
printf("\n");
}
for (i=0;i<n;i++) {
if (bio[i]==0) {
bio[i]=1; /* "zabranjujemo" da se ovaj broj ponovi */
polje[p-1]=i; /* upisujemo iduci broj u permutaciji */
rek(p-1, n);
bio[i]=0; /* "dopustamo" da se ovaj broj kasnije ponovo koristi,
posto smo ga vec u svojoj rekurziji na ovom mjestu
vec obradili! - malo razmisliti o ovom djelu :)*/
}
}
}

int main() {
memset(polje, 0, sizeof(polje));
memset(bio, 0, sizeof(bio));
rek(4, 4);
return 0;
}

[/code:1]

onaj memset dio samo resetira oba polja na nulu...
princip je da kad udjes u rekurziju isprobas sve brojeve koji do sad nisu bili upotrebljeni, te kad naidjes na neki takav, stavis ga u polje i pozoves se za polje nize.
(funkciju sam napisao tako da puni polje "odozada", jer je tako lakse isprogramirati).

polje "bio" sluzi tome da lako saznas jesi li neki broj vec koristio, a polje "polje" sluzi ispisu tih permutacija (u nju trpas brojeve kako padas dublje u rekurziju).

funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.

bitno je odmah nakon izlaska iz rekurzije resetirati bio[i] na nulu!
evo cijeli kod

Kod:
#include <stdio.h>
#include <string.h>

#define MAX 10

int bio[MAX];
int polje[MAX];

void rek(int p, int n) {
   int i;
   if (p==0) { /* ako smo popunili polje, ispisi ga! */
      for (i=0;i<n;i++)
         printf("%d ", polje[i]+1);
      printf("\n");
   }
   for (i=0;i<n;i++) {
      if (bio[i]==0) {
         bio[i]=1; /* "zabranjujemo" da se ovaj broj ponovi */
         polje[p-1]=i; /* upisujemo iduci broj u permutaciji */
         rek(p-1, n);
         bio[i]=0; /* "dopustamo" da se ovaj broj kasnije ponovo koristi,
                            posto smo ga vec u svojoj rekurziji na ovom mjestu
                            vec obradili! - malo razmisliti o ovom djelu :)*/
      }
   }
}

int main() {
   memset(polje, 0, sizeof(polje));
   memset(bio, 0, sizeof(bio));
   rek(4, 4);
   return 0;
}



onaj memset dio samo resetira oba polja na nulu...
princip je da kad udjes u rekurziju isprobas sve brojeve koji do sad nisu bili upotrebljeni, te kad naidjes na neki takav, stavis ga u polje i pozoves se za polje nize.
(funkciju sam napisao tako da puni polje "odozada", jer je tako lakse isprogramirati).

polje "bio" sluzi tome da lako saznas jesi li neki broj vec koristio, a polje "polje" sluzi ispisu tih permutacija (u nju trpas brojeve kako padas dublje u rekurziju).

funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.

bitno je odmah nakon izlaska iz rekurzije resetirati bio[i] na nulu!



_________________
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3560)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 22:38 pon, 29. 8. 2005    Naslov: Citirajte i odgovorite

[quote="ahri"]funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.[/quote]

Danas sam na konzultacijama vidio jedno zanimljivo rjesenje bez polja [tt]bio[/tt], ali i bez trazenja po cijelom polju [tt]polje[/tt]. :D Wanna guess how? :g: (mislim da se ne dobije nista na slozenosti, ali je zanimljjvo 8))
ahri (napisa):
funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.


Danas sam na konzultacijama vidio jedno zanimljivo rjesenje bez polja bio, ali i bez trazenja po cijelom polju polje. Very Happy Wanna guess how? Mr. Green (mislim da se ne dobije nista na slozenosti, ali je zanimljjvo Cool)



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
ahri
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07)
Postovi: (193)16
Sarma = la pohva - posuda
= 7 - 0

PostPostano: 3:33 pet, 2. 9. 2005    Naslov: Citirajte i odgovorite

npr:

[code:1]
int polje[MAX];

void rek(int p, int n) {
int i;
if (p==0) {
for (i=0;i<n;i++)
printf("%d ", polje[i]);
printf("\n");
}
for (i=0;i<p;i++) {
swap(polje[i], polje[p-1]);
rek(p-1, n);
swap(polje[i], polje[p-1]);
}
}

int main() {
int i, n=4;
for (i=0;i<n;i++)
polje[i]=i;
rek(4, 4);
return 0;
}

[/code:1]
npr:

Kod:

int polje[MAX];

void rek(int p, int n) {
   int i;
   if (p==0) {
      for (i=0;i<n;i++)
         printf("%d ", polje[i]);
      printf("\n");
   }
   for (i=0;i<p;i++) {
         swap(polje[i], polje[p-1]);
         rek(p-1, n);
         swap(polje[i], polje[p-1]);
   }
}

int main() {
   int i, n=4;
   for (i=0;i<n;i++)
      polje[i]=i;
   rek(4, 4);
   return 0;
}




_________________
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3560)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 6:18 pet, 2. 9. 2005    Naslov: Citirajte i odgovorite

Moze i tako. :) Nacin koji sam ja vidio (i zahtijeva nesto vise operacija) je cirkularno kruzenje "nepotrosenog" dijela polja. 8) No, tvoje je brze. =D> (iako se meni bas svidja ideja da se "ostatak" vrti u krug ;))
Moze i tako. Smile Nacin koji sam ja vidio (i zahtijeva nesto vise operacija) je cirkularno kruzenje "nepotrosenog" dijela polja. Cool No, tvoje je brze. Applause (iako se meni bas svidja ideja da se "ostatak" vrti u krug Wink)



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
ahri
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 19. 11. 2003. (23:16:07)
Postovi: (193)16
Sarma = la pohva - posuda
= 7 - 0

PostPostano: 2:00 sub, 3. 9. 2005    Naslov: Citirajte i odgovorite

a ono:). fora je, al totalno neefikasno ako mene pitas;).
ovo moje je okej, ali malo teze za objasniti ljudima koje to bas ne zanima... IMHO naravno.
tako da, kad objasnjavam permutacije rekurzivno, koristim gornju metodu... ujedno zato sto se preko nje lagano objasni i DFS i jos neki slicni algoritmi...
:)

eto... zanimljiv topic u svakom slucaju.
:mah-mah:
a ono:). fora je, al totalno neefikasno ako mene pitas;).
ovo moje je okej, ali malo teze za objasniti ljudima koje to bas ne zanima... IMHO naravno.
tako da, kad objasnjavam permutacije rekurzivno, koristim gornju metodu... ujedno zato sto se preko nje lagano objasni i DFS i jos neki slicni algoritmi...
:)

eto... zanimljiv topic u svakom slucaju.
:mah-mah:



_________________
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan