Rekurzivne generovane pole – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rekurzivne generovane pole – Java – Fórum – Programujte.comRekurzivne generovane pole – Java – Fórum – Programujte.com

 

Petr
~ Anonymní uživatel
746 příspěvků
17. 11. 2012   #1
-
0
-

Ahoj,

nemohli byste mi prosim ukazat nejaky jednoduchy priklad jak pracovat s metodou kde vysledkem je pole a ma to byt rekurzivni? Dejme tomu, ze chci vygenerovat predem dany velky pole a nahazet tam nejaky cisla, jedina podminka aby se neopakovali.

znamy mi radil, abych to udelal rekurzivne (to neopakovani se), ale vubec netusim jak pracovat s rekurzi a polem zaroven.

diky

Nahlásit jako SPAM
IP: 81.201.55.–
liborb
~ Redaktor
+18
Guru
18. 11. 2012   #2
-
0
-

To nebyla dobrá rada. Na naplnění pole unikátními čísly ti stačí 2 cykly. Použití rekurze musí mít hoooodně dobrý důvod a tady si rekurzi pěkně zavaříš.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.217.–
Petr
~ Anonymní uživatel
746 příspěvků
18. 11. 2012   #3
-
0
-

Ja vim, to zvladam, ale ucim se ted prave delat s tou rekurzi a vubec nechapu jak by to melo s tim polem pracovat.

Nahlásit jako SPAM
IP: 81.201.55.–
liborb
~ Redaktor
+18
Guru
18. 11. 2012   #4
-
0
-

Nehledej v tom vědu. Prostě funkce bude příjmat pole jako parametr a vracet bude třeba bool. Rekurzí nahrazuješ jeden cyklus, takže ještě budeš předávat index prvku, který se na kontrolovat a počet prvků pole. A samozřejmě testované číslo. Funkce tedy bude vypadat tak, že nejprve zkusí, jestli už není index za hranicí pole a pokud ano, tak vrátí, že prvek v poli není. Pak se provede kontrola prvku na daném indexu a případně návrat, pokud se shoduje. No a pokud se neshoduje, tak funkce bude vracet volání (rekurzivní) té tvojí funkce s indexem o jednu větším. Takže tělo funkce bude mít 3 řádky.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.208.–
Petr
~ Anonymní uživatel
746 příspěvků
18. 11. 2012   #5
-
0
-

Když ta metoda bude vracet bool, tak jak z ní to pole potom dostanu ?

Nahlásit jako SPAM
IP: 81.201.55.–
liborb
~ Redaktor
+18
Guru
18. 11. 2012   #6
-
0
-

Nijak. Ta rekurzivní funkce bude jen na kontrolu, jestli už tam to číslo není. Pokud chceš udělat rekurzivně i to plnění pole, tak ta funkce bude to pole vracet.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.211.–
Petr
~ Anonymní uživatel
746 příspěvků
18. 11. 2012   #7
-
0
-

Ach jo, sem v tom uplně ztracenej. Pokusil sem se něco stvořil, ale vůbec mi to nefunguje.

 

    public static int[] Gen(){
        
          Random R = new Random();
        
    int[] pole = new int[10];
        
        for (int i = 0; i < pole.length; i++) {
          int r =R.nextInt(9)+1;
          
          pole[i]=r;
          
            if (Kontrola(pole, i) == true) {
                i--;
            }
        }
        
        return pole;
        
    }

    public static boolean Kontrola(int[] pole,int n){
    
        for (int i = 0; i < n; i++) {
       
             if (pole[n]== pole[i]) {
            return true;
             }
        }

        return false;
        
        
    }
Nahlásit jako SPAM
IP: 81.201.55.–
Dano
~ Anonymní uživatel
101 příspěvků
18. 11. 2012   #8
-
0
-

Pracovat s polom je podla mna strasne nepohodlne a treba mat na to zavazny dovod, napriklad prikaz ucitela ;) . Java ma pre pracu s kolekciou lepsie objekty. V Tvojom pripade by som pouzil java.util.Set. Do Setu nezadas dve rovnake hodnoty a tak nemusis vymyslat rekurzivnu atomovu elekraren na to aby si ho naplnil a pritom overil duplicitu vkladanych hodnot. Skaredy je len samotny prevod zo Set -> Array

public Integer[] getArrayFromSet(int pocetPrvkov) {
    Set<Integer> cisla = new HashSet<Integer>();
    while(cisla.size() < pocetPrvkov) {
        cisla.add(rand.nextInt(100));
    }

    return new ArrayList<Integer>(cisla).toArray(new Integer[cisla.size()]);
}
Nahlásit jako SPAM
IP: 78.98.66.–
Petr
~ Anonymní uživatel
746 příspěvků
18. 11. 2012   #9
-
0
-

treba mat na to zavazny dovod, napriklad prikaz ucitela ;) .

Jo a přesně ten já mám. :) Jsem začátečník a tohle jsou mé první tři měsíce s algoritmizací. Promiň, ale tomu tvýmu kódu vážně vůbec nerozumím... Nepochybuju o tom, že je ergonomičtější, lepší, kratší, elegantnější než ten můj, ale 3 z 5ti řádků nechápu co dělají, takže to myslím nemá moc smysl.

Nahlásit jako SPAM
IP: 81.201.55.–
Dano
~ Anonymní uživatel
101 příspěvků
18. 11. 2012   #10
-
0
-

#9 Petr
Myslel som si :) No nedalo mi to ukazat, ze veci sa daju robit jednoduchsie.

Nahlásit jako SPAM
IP: 78.98.66.–
sleepy0
Stálý člen
19. 11. 2012   #11
-
0
-

#9 Petr
Tak ak mas pevnu dlzku pola tak, si najskorej vygeneruj list s cislami (ono da sa to aj z polom ale je to menej pohodlne ;) ). list = {1,2,3,4,5,6,7,8 ... n} , teda ak je n male cislo. Toto sa hodi ak chces robit nejake permutacie. A mas n - prvkove pole a potom uz len si vygeneruje int vzdy taky aky je dlhy list. A to cislo z toho listu vytiahnes a ulozis do pola, asi takto:  

public int[] Gen(int n, int min, int max){
	int[] pole = new int[n];
	// Generujes list ale taketo nieco sa da robit aj s polom,
	// staci vytvorit dlhe pole a ak nejaku hodnotu precitas tak ju vymazes
	// a zvysne poposuvas o 1, tak aby nemalo pole medzery.
	List<Integer> list = new LinkedList<Integer>();
	for(int i=min; i<=max; i++){
		list.add(new Integer(i));
	}
	Random r = new Random();
	// Teraz uz len generujes tak velke ako je dlzka pola
	for(int i=0; i< n; i++){
		int c = r.nextInt(list.size());// gen nahodne cislo o velkosti listu
		pole[i] = list.get(c).intValue(); // vyberes to cislo
		list.remove(c); // zmazes ho aby sa nevybralo na novo a nemusis pocuvat ako poli ;)
	}
	return pole; // Malo by to fungovat, ale pre velmi velke polia by to bolo pamatovo neefektivne
}

Preto tu napisem este riesenie cez 2 metody, ako mas aj ty:

public int[] gen(int n, int min, int max){
	if(max - min < n){
		System.out.println("pocet hodmot musi byt mensi ako pocet moznych gen. cisel");
		return null;
	}
	int[] pole = new int[n];
	Random r = new Random();
	for(int i=0; i<n; i++){
		int c = 0;
		do{
			c = r.nextInt(max-min) + min;
		} while(kontrola(pole,c)) // ak taketo cislo uz exituje v tomto poli, generuje ine nahodne cislo
		pole[i] = c; // Ak najdem take ktore neexistuje dopisem ho do pola
	}
}

public static boolean kontrola(int[] pole, int c){
	// prejdem prvky pola ak najdem rovnake cislo tak vratim true, inak false
	for(int i=0; i< pole.length; i++){
		if(c==pole[i])
			return true;
	}
	return false;
}

Chybu mas v tom ze generujes prilis malo cisle, iba 9, do 10 prvkoveho pola cize aspon jedno sa ti tam urcite bude opakovat.

Nahlásit jako SPAM
IP: 158.195.195.–
liborb
~ Redaktor
+18
Guru
19. 11. 2012   #12
-
0
-

Dano tu krásně potvrdil teorii, co tu razí hlavně KIIV, ale abych nebyl alibista, mám stejný názor - co neřeší nějaká třída, tak programátoři v Javě tak nějak těžko řeší :). Příklady jsou hezké, ale hlavně tam chybí ta rekurze, o kterou tu mělo jít. Takže kontrola v rekurzivní verzi: 

public static boolean kontrola(int[] pole, int c, int index, int max){
	if (index >= max) return(false);

	if (pole[index] == c) return(true);

	return(kontrola(pole, c, index + 1, max));
}

která se volá:

kontrola(pole, c, 0, n);

Podobným způsobem uděláš i to generování. Když ti to nebude fungovat, tak sem hoď, co vytvoříš a uvidíme :)

Nahlásit jako SPAM
IP: 188.75.135.–
Dano
~ Anonymní uživatel
101 příspěvků
19. 11. 2012   #13
-
+1
-
Zajímavé

#12 liborb
Neda mi neodpovedat ;) Mojim prispevkom som len chcel poukazovat, ze veci sa daju robit aj jednoducho. A bolo by hlupe nevyuzit existujucu funkcionalitu, ked ju uz niekto nakodil, krasny priklad je libka commons-lang.

Skor by som to otocil, ze javisti maju otvorenu mysel aj pre riesenia tretich stran ;) a nemusia si vzdy vsetko od piky kodit.

Nahlásit jako SPAM
IP: 195.28.127.–
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, 18 hostů

Podobná vlákna

Násobenie rekurzívne — založil audiotrack

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ý