John wrote:
> Hej Gruppe
> Er der ikke en der kan fortælle mig hvad subj. er
Når funktioner kalder sig selv. Der er i hvert fald 2 måder at lave
gentagelser på, rekursion og iteration:
// udskriv tal fra 0 til n
static void iterative( int n )
{
for( int i = 0; i < n; i++ )
{
System.out.println( i );
}
}
// udskriv tal fra start til n
static void recursive( int start, int n )
{
if( start >= n )
{
return;//rekursion færdig
}
System.out.println( start );
recursive( start+1, n ); // rekursivt kald
}
Der er nok iøjnefaldende, at den rekursive metode tager et argument mere
end den iterative - det skyldes at man både skal vide hvor man "er"
(start) og
hvor man skal "hen" (n). Den lokale variabel "i" fra den iterative
metode er
man nødt til at overføre i funktionskaldet, da en opdatering af en lokal
variabel
ikke er synlige "udenfor" funktionen - heller ikke selv om "udenfor" i
dette tilfælde
er funktionen selv.
Den rekursive metode er for de fleste også sværere
at læse end den iterative, men der findes sprog, hvor man ikke har
løkker, og
derfor er tvunget til at bruge rekursion ved gentagelser.
Noget, der er knap så iøjnefaldende er, at den rekursive metode er langt
mindre
effektiv - i forhold til tid og brug af hukommelse end den iterative.
Man kan sige,
at et metodekald er meget dyrt i forhold til at gentage med en løkke.
Derfor må
det generelt anbefales at minimere forekomsten af rekursion i sine
programmer -
også fordi det er sværere at læse. Der er dog nogle problemer, hvor
rekursion
giver mere "naturlige" og læsevenlige programmer, og som er svære at
udtrykke
med iteration
Ulrik Magnusson
--
"I'm a big tough man with a big tough plan
gonna spend my day in a big tough way"
Adam & the Ants - "5 Guns West", Prince Charming 1981
Visit my home page:
http://www.geocities.com/ulrikm