[php] recursieve functie returned niks

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey mensen,

Ik heb een probleem waarbij een recursieve functie een boolean waarde moet returnen. Ik heb het probleem beperkt tot deze testcase:
PHP:
1
2
3
4
5
6
7
8
9
10
function aap($a)
{
    if($a == 10)
        return true;
    
    $a++;
    aap($a);
}

echo aap(3);
Deze functie returned helemaal niks. Als ik met gettype het type opvraag is het wel een boolean. Het heeft (volgens mij) te maken met dat deze functie zichzelf aanroept en daarmee niet meer "weet" aan wie hij de waarde moet returnen.

Ik ben er terwijl ik dit topic schrijf ook achter hoe ik het kan oplossen alleen zou ik graag weten hoe dit het technisch door (in dit geval) php intern wordt afgehandeld.
Het is op te lossen door de waarde van aap($a) weer te returnen aan de functie zelf.
PHP:
1
2
3
4
5
6
7
8
9
10
function aap($a)
{
    if($a == 10)
        return true;
    
    $a++;
    return aap($a); //hier dus
}

echo aap(3);
Zou iemand kunnen uitleggen hoe zoiets intern werkt want waarom verliest hij de pointer als ik aap($a) niet return aan de functie?

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Vrij eenvoudig... Je roept de functie wel recursief aan, maar je doet niets met de return waarde van die aanroep. Een recursieve aanroep creeert een ketting van functieaanroepen die allemaal iets moeten returnen naar de aanroeper. Op die manier kan de eerst aangeroepen functie een zinvolle waarde teruggeven.

Acties:
  • 0 Henk 'm!

  • trinite_t
  • Registratie: Maart 2003
  • Laatst online: 17-09 14:06
Zoals jij het deed geef je alleen de return waarde terug aan de functie waarvan a==10. Deze functie doet er verder niets mee, dit terwijl je wilt dat de functie die je als eerste hebt aangeroepen (aap(0);) de waarde returnt. Om dit te bereiken moet de return waarde dus "terugstromen" door alle voorgaande "functie-aanroepen". Dit bereike je door de waarde van de functie aanroep te returnen.

edit:
spuit 11 :X

[ Voor 8% gewijzigd door trinite_t op 29-05-2006 10:36 ]

The easiest way to solve a problem is just to solve it.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Je originele aanroep van aap() returnt ook geen waarde. $a is in die aanroep immers nooit 10, dus returnt hij geen true. Hij komt dus wel verder in je code, en roept zichzelf nog een keer aan. Echter, aan de waarde die dat returnt heb je niks, want die waarde sla je niet op in je functie en je returnt hem ook niet. Je eerste voorbeeld is dus gewoon slechte recursie. Je kan niet van PHP gaan verwachten dat het je returnwaardes onthoudt als je dat niet aangeeft. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 20-09 00:03

hamsteg

Species 5618

Als je de code wat beter herschrijft zal het ook duidelijk worden

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function aap($a)
{
    if($a == 10)
    {
        return true;
    }
    else
    {
        $a++;
        aap($a);
// waar is je return value handling ? Inconsequent gebruik en dan snapt geen enkele compiler het meer
        return false;
    }
}

echo aap(3);

ok, meerdere antwoorden ... overbodig.

[ Voor 9% gewijzigd door hamsteg op 29-05-2006 10:46 ]

... gecensureerd ...


Acties:
  • 0 Henk 'm!

  • Upsal
  • Registratie: Mei 2005
  • Laatst online: 27-08-2024
Is het probleem ook niet op te lossen met een while?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke duidelijk :) Bedankt voor de reacties!

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Upsal schreef op maandag 29 mei 2006 @ 10:44:
Is het probleem ook niet op te lossen met een while?
Zo'n testcase wel ja, natuurlijk. 8)7

Sommige problemen zijn beter recursief te tacklen.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1