Rekursiv

User Maik

Mitglied
Hay
Wer kann mir Rekursiv erläutern.

Ich habe eine

$zahlen[]=array(1,2,3...);

Function anzahl(){
if(!isset($zahlen)){
echo "Die Anzahl der Zahlen sind: ".$x;
}
?
}
anzahl();

so als Vorlage.

Danke Maik
 
rekursiv würde in dem falle bedeuten, deine funktion wird 1x aufgerufen, danach ruft sich die funktion so lange selbst auf, bis eine bestimmte abbruchbedingung erfüllt ist, die bei dir fehlt.

deine vorlage ist leider etwas unpraktisch...
nehmen wir erstmal ein eindimensionales array und kein zweidimensionales:
PHP:
   $zahlen = array(1,2,3,4,5,6,7,8);

so hier die funktion der rukursion

PHP:
function anzahl($my_array, $index)
{
 if( ! isset($my_array[$index]) )
 	return 0;
 else
 	return (1 + anzahl($my_array, $index+1));
}

sie empäfngt 2 parameter: 1x das array, zum anderen ein startindex, weil irgendwie muss man ja durch das array kommen.
die abbruchbedinung ist, dass das aufgerunfene element des arrays nicht vorhanden ist. dann gibt die funktion eine 0 zurück.
ansonsten addiert sie 1 + den aufruf von sich selbst, mit dem gleichen array jedoch dem index um 1 erhöht (da wir ja an die nächste stelle des arrays wollen).
alternativ kann man auch eine arrayreferenzn übergeben
PHP:
function anzahl(&$my_array, $index)
damit nicht jede funktion mit einer lokalen kopie des arrays arbeitet umd so im ernstfall den speicher wenigstens etwas zu schonen.

hoffe du hast die rekursion verstanden.
prinzipiell eben eine funktion die sich immer selbst aufruft, bis zu einer bestimmten abbruchbedinung.
ein besseres beispiel wäre hier die fakultät (!5 = 5*4*3*2*1), aber egal.
es gibt auch noch endrekursive funktionen aber was da nochmal genau der unterschied war weiss ich auch nicht mehr genau....
 
Wenn man aber einfach z.B. folgenden Code ausführt:
PHP:
function foo()
{
    foo();
}

foo();
Die Funktion hat in ihrem Code einen Aufruf zu sich selbst. Man spricht von
Rekursion
Das obige Beispiel hat aber einen Nachteil: Es wird eine Endlos-Schleife geben und entweder die max_execution_time erreicht, oder der Webserver
wird abstürzen. In beiden Fällen jedenfalls ein Performanceverlust.

Was man braucht ist daher eine Abbruchbedingung.
Das kann man z.B. mit einem Counter machen:
PHP:
function foo( $a_iCount )
{
    if ($a_iCount > 0) {
        foo( $a_iCount - 1);
    }
}

foo(4);
Erklärung: Der Funktion foo wird eine Zahl übergeben. Nun wird geprüft,
ob die Zahl größer null ist und, wenn ja, die Funktion noch ein mal aufgerufen.
Diesmal wird die Zahl - 1 übergeben.
D.h. im Klartext: irgendwann wird die Zahl einen Wert von null haben und die
Funktion hört auf sich selber auf zu rufen. Die Funktion wurde nun eine
bestimmte Anzahl mal aufgerufen.

Die beiden obigen Beispiele haben allerdings eines gemeinsam: Sie
machen nichts.

Ein konkretes Beispiel wäre z.B. folgendes:
Es wird ein Array definiert, welches mittels Rekursion vollständig ausgegeben
werden soll.
Dazu übergeben wird der Funktion das Array und die Länge des Arrays.
Innerhalb der Funktion wird die übergebene Länge dann allerdings nicht
mehr als Länge benutzt, sondern als aktuelle Position im Array, sprich
welches Element als nächstes ausgegeben werden soll.
Der Code:
PHP:
function foo( $a_iPos, $a_aArray )
{
    if ($a_iPos > 0) {
        echo $a_aArray[$a_iPos]."<br>\r\n";
        foo( $a_iPos - 1 );
    }
}

$aBar = array( 10, 21, 43, 12, 43);
foo( count($aBar) - 1, $aBar);
Q: Warum wird count($aBar) - 1 und nicht nur count($aBar) übergeben?
A: Weil er direkt das Element ausgibt, dessen Index wird übergeben haben,
und da count($aBar) zwar die Anzahl der Elemente im Array zurückgibt,
aber die Array-Zählung bei null beginnt muss man logischerweise die
Länge - 1 übergeben.
Q: Wieso wird das Array rückwärts ausgegeben?
A: Weil man mit count($aBar) - 1 zuerst das letzte Element anspricht.
Wenn man es nicht will, kann man die Funktion auch so aufrufen:
PHP:
foo(count($aBar) - 1, array_reveres($aBar))

hth
 
Zuletzt bearbeitet von einem Moderator:
Erstmal Danke für die schnelle Hilfe.
Hat mir leider nicht so viel gebracht,
aber ich bin ja noch jung und kann noch viel viel üben. :-)
Nach Stunden habe ich das doch noch geschnallt.
Sollte so aussehen.
<?

$zahlen=array(1,2,3,4,5,6,9,7,2,3,5);

function test($e, $zaehler){
global $zahlen;

if(!$zahlen[$e]){
echo "$zaehler"." ist die Summe der Zahlen";
return $zahlen[$e];
}

$left=test($e+1, $zaehler+1);
return $left;

}
test(0, 0);
?>

Bis bald mal wieder.
 
sieht irgendwie umständlich und dazu noch falsch aus...
entweder ein tippfehler, denn 11 ist die anzahl der zahlen oder ein rechenfehler, da 11 eben nicht die summe der zahlen ist... ;)
 
Ja richtig, die Summe der Zahle ist natürlich nicht 11.
Ich meinte die Anzahl der Zahlen im array ist 11!

Danke für den Hinweis.
 
Zurück