» »

[JAVA] rekurzivni izpis seznama z kazalci

[JAVA] rekurzivni izpis seznama z kazalci

l0g1t3ch ::

V javi mam en program, ki mi zgradi enosmerno povezan seznam z kazalci in ga napolni z objekti nekega mojga razreda.
Sedaj pa bi ga rad izpisal in sicer rekurzivno in po desetinah. Rekurzivni izpis sam mi ne dela težav, nikakor pa mi ne rata da bi mi ta seznam izpisal po desetinah.
Recmo d mamo v seznamu 100 elemntov bi izpisal 10,20,..., 100

Tukaj je še koda za samo rekurzivni izpis


//rekurzivni izpis celega seznama
private static void izpis_seznamaL( Object iter )
	{
		if( ! slovar_L.overEnd(iter) )
		{	
			System.out.println( slovar_L.retrieve( iter ) );
			izpis_seznamaL( iter = slovar_L.next(iter) );	
		}
	}


//klic zgornje metode; .first() vrne kazalec na prvi element seznama tega potem kot parameter podamo metodi
//.izpis_seznamaL()
Object iter = slovar_L.first();
izpis_seznamaL( iter);

Quikee ::

Mogoče kaj takšnega..

private static void izpis_seznamaL( Object iter, int counter )
	{
		if( ! slovar_L.overEnd(iter) )
		{	
			if ((counter % 10) == 0)
				System.out.println( slovar_L.retrieve( iter ) );
			izpis_seznamaL( iter = slovar_L.next(iter), counter + 1 );	
		}
	}

l0g1t3ch ::

Ni tko, mogoč sm mal slab napisu bom poskusu še 1x

tvoja koda dela tko da izpiše vsak deseti vnos, recmo mam v seznamu 300 elemetov bo izpisal elemente na 10,20,30,.. 300 poziciji pač vsakega desetega skupaj 30 izpisov.

Jest pa rabm d je točn 10 izpisov. Izpiše vsako desetino seznama. V zgornjem primeru bo izpisal elemente na poziciji 30,60,...,300

Quikee ::

Če poznaš število vseh elementov lahko namesto (counter % 10) narediš (counter % (slovar_L.size() / 10)). Problem je, če število elementov ni deljivo z 10 - recimo pri 361 bi izpisal 36 krat samo bi "pozabil" na zadnji element. Odvisno če si to želiš ali ne.

l0g1t3ch ::

Mnja proh hitr mi vrže zdej stackOverFlow exception :\
Sicer dela že sam to me še muči
Pa ni mi jasn zakaj pride do te napake, sej če izpisuješ vse dela tu pa sam en dodatn parameter še šibaš naprej se pa krešira :s

l0g1t3ch ::

tak očitn nav šlo, ker pri 10k besedah se prav tolikokrat funkcija kliče samo sebe in vse zo se shranjuje na sklad pa še uni parametri in je zgleda prevč :D

Zgleda bo treba čist drug pristop. Kaka ideja ?
Imam znano velikost seznama in moram ga izpisati po desetinah

Quikee ::

Če je preveč za rekurzijo pa uporabi normalno while iteracijo, ki je tak ali tak hitrejša in manj omejena.

private static void izpis_seznamaL( )
	{
		int counter = 0;
		Object iter;

		while( ! slovar_L.overEnd(iter) )
		{	
			if (counter % (slovar_L.size() / 10))
				System.out.println( slovar_L.retrieve( iter ) );
			iter = slovar_L.next(iter);
			counter+=1;
			
		}
	}

l0g1t3ch ::

Mnja ampak kaj ko MORAM uporabit rekurzijo. In baje je rešitev preprosta skoraj trivialna.

noraguta ::

stack imaš omejen , jvm ne poznam v podrobnosti ampk ne gre rekurziven sklic v neskončnost pa da ga jebeš. je pa možno da zna jvm(ampak to ne vem zares) tail rekurzijski sklic pretvorit v iteracijo. potem se lahko graš na ta nalin. ampak v splošnem to rekurzijo ne boš na dandanašnjih arhitekturah učinkovito urotil kar tako.
Pust' ot pobyedy k pobyedye vyedyot!

PaX_MaN ::

Kaj pa če bi Smetarja klical vsakih par iteracij?

noraguta ::

nima veze smetar tu , stack ni neomejen. če bi bil zlahkoto povoziš najprej aplikacijo nato pa tudi os. pomnilik pravzaprav zasega os in zgodovina kot s evleče je ugotovila , da je to vrstno programiranje nevarno, se zna spremenit. ampak ne in general , stvari se pribajo reševar na ravni semantike jezika ugotovit kje je rekurzija in spremenit v itaracijo. za repno se to da avtomatizirat. za druge je pa težje. se dela na tem sam prekmau smo rojen , ...

no nasplošno pa prav zavese se ne da povedat da se da, oz tudi če se da mogoče ugotavljanje zahteva nedoločen čas če se še kej spomnem postulatov.

pa ne mečte kamna po men!
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()

Quikee ::

l0g1t3ch: Jaz nisem zmozgal nič uporabnega več.. če boš izvedel rešitev, jo prosim napiši.

PaX_MaN: dvomim, da bi smetar bil uporaben pri rekurziji. Ko stack filaš ga ne moreš za sabo brisat, ker se moreš še na isto točko vrnit. Slej ko prej bi prišlo do stack overflow-a.

Genetic ::

Mogoce pa kaj takega:

private static void izpis_seznamaL( Object iter, int st_izpisov )
	{
                if (st_izpisov == 0) return;  // izhod iz rekurzije
                int i = slovar_L.size(iter) / st_izpisov; //size(iter) vrne velikost podseznama od iter do end
                while (!slovar_L.overEnd(iter) && (--i > 0)) iter = slovar_L.next(iter) ;
		if( ! slovar_L.overEnd(iter) )
		{	
			System.out.println( slovar_L.retrieve( iter ) );
			izpis_seznamaL( iter = slovar_L.next(iter), st_izpisov -1 );	
		}
	}


Torej, na zacetku imas cel seznam, za eno desetino se postavis na desno (z while zanko), izpises element, na katerega kaze iter, ter rekurzivno na ostanku seznama sedaj gres izpisovat devetino preostalega seznama ...

kyusss ::

Probaj povečat velikost stacka v javi. Mislim da to nardis z -Xmx512M (nisem ziher preveri z java -X).

Quikee ::

Probaj povečat velikost stacka v javi. Mislim da to nardis z -Xmx512M (nisem ziher preveri z java -X).
Še enkrat - to ni rešitvev problema. Če bo delal zdaj algoritem za 10000 elementov, mogoče pa ne bo za 1000000 ali 10000000 elementov.

Prava dobra rešitev je Geneticova, saj je rekurzivna in hkrati do stack overflowa ne more prit kar tako hitro. Tudi sam sem imel idejo, za kaj takšnega ampak ko sem o njej razmišljal se mi ni zdela prava.

l0g1t3ch ::

Mnja sam sem pol rešu zadevo tako da sm kombiniru rekurzijo in iteracijo.
Nekaj takega kot je napisal Genetic samo da sm uporabu for zanko. Je pa sicer ti seminarska za APS1 na fri in sm za ves ostali del naloge porabu manj časa kot za tole mozganje kam poturit rekurzijo, ki je itak sama sebi namem v našem danem primeru. Ne pravim da je brezveze rekurzija nasplošno, ampak tu jo mormo uporabit sam v tolko d asistenti vidjo d znamo :\


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242057 (1393) NejcSSD
»

Java skeniranje map in podmap

Oddelek: Programiranje
61073 (962) nightrage
»

Java metode;

Oddelek: Programiranje
354551 (3743) ragezor
»

Rekurzija v javi z ArrayList

Oddelek: Programiranje
81467 (1310) marjan_h
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
223050 (3050) morbo

Več podobnih tem