Permutacie s opakovanim rekurzivne – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Permutacie s opakovanim rekurzivne – C / C++ – Fórum – Programujte.comPermutacie s opakovanim rekurzivne – C / C++ – Fórum – Programujte.com

 

adzam333
~ Anonymní uživatel
2 příspěvky
5. 4. 2016   #1
-
0
-

Zdravim potreboval by som pomoct s jednym kodom je to program na vypocet permutacii s opakovanim a vyzera asi takto:

#include <stdio.h>

#define MAXN 10
#define MAXSUM 50

int c[MAXN], n, sum;
int a[MAXSUM];

void print(int k)
{
  int i;
  if (k == sum)
  {
    for (i = 0; i < sum; i++)
      printf("%d ", a[i]+1);
    printf("\n");
    return;
  }

  for (i = 0; i < n; i++)
    if (c[i] > 0)
    {
      c[i]--; 
      a[k] = i;  
      print(k+1); 
      c[i]++;  
    }
}

int main(void)
{
  int i;
  scanf("%d", &n);
  for (i = sum = 0; i < n; i++)
  {
    scanf("%d", &c[i]);
    sum += c[i];
  }
  print(0);
  return 0;
}


problem je ze nechapem ako vlastne funguje ta reverzia v tomto programe a co vlastne reprezentuju premenne i a k...mohol by mi niekto laicky vysvetlit fungovanie tohto algoritmu?(teraz nemyslim take vysvetlenie ze tu sa z pola c odrata jednotka nasledne sa zavola ta a ta funkcia atd. ale skor vysvetlenie pricipu toho algoritmu) Dakujem pekne

Nahlásit jako SPAM
IP: 78.98.64.–
ctverec
~ Anonymní uživatel
16 příspěvků
7. 4. 2016   #2
-
0
-

Dobrý den, program simuluje všechny permutace s opakováním, tiskne po řádcích jednotlivé varianty. Každý řádek reprezentuje všechny prvky na jednotlivých pozicích, přičemž číslo na každé pozici značí, ze které skupiny prvků je prvek na daném místě. Tedy počet řádků je počet permutací. Proměnná 'i' je ve všech třech cyklech pouze lokální pomocný index. Proměnná k už je zajímavější. Reprezentuje pozici prvku, pro který se pro daný řádek generuje/zjišťuje ze které má být skupiny. Metoda print se volá pro všechny prvky pro všechny řádky. Jede se pěkně souvisle po řádcích a každý postupně pro k od 0 až po počet prvků-1. Rekurze pracuje tak, že v každý okamžik dělí prvky na dvě poloviny. Tu první považuje za danou, v té druhé hledá všechny kombinace, resp. kombinaci následující. Takže hemžení probíhá odprava, naopak nejpomalejší pohyb je vlevo.
 

Nahlásit jako SPAM
IP: 89.177.134.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Podobná vlákna

Permutacie — založil Peter D.

Variace s opakovanim — založil jirka

Variace s opakovanim — založil Milan

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý