Duktig på logik? Skriva om rekursiv funktion till iterativ

Permalänk
Medlem

Duktig på logik? Skriva om rekursiv funktion till iterativ

Hej!

Såhär är det:

Jag har ett vanligt enkelt kategorisystem i en databas där det finns tre kolumner, cid (category id), name och pcid (parent category id).

De som saknar föräldrar, dvs de noder som är högst upp i hierarkin har pcid = 0.

Följande kodsnutt gör precis det jag vill:

function findChildren ($carrier, $pcid, $level) { for ($i=0; $i<count($carrier); $i++) { if ($pcid==$carrier[$i]['pcid']) { for ($j=0; $j<=(($level+1)*2); $j++) echo (" "); echo ($carrier[$i]['name'] . " \n"); echo ("<br />"); findChildren($carrier,&$carrier[$i]['cid'], $level+1); } } } for ($i=0; $i<=$carriersize; $i++) { if ($carrier[$i][pcid]==0) { echo ($carrier[$i]['name'] ." \n"); echo ("<br />"); findChildren($carrier, &$carrier[$i]['cid'], 0); } }

Dock har jag brottats hela dagen med tanken över hur jag kan göra detta genom en iterativt istället för rekursivt. Jag hoppas koden är läsbar Enkelt sagt:

1. Koden hittar Föräldralösa-föräldrar.
2. Ett anrop görs till findChildren() och barnen hittas
3. När varje barn hittas, anropas findChildren() igen för att hitta eventuella barn
4. När eventuella barn hittas, anropas findChildren för de. osv osv osv, tills alla nivåer har gåtts igenom.

Går detta att göra iterativt på ett smidigt sätt?

Visa signatur

Let me tell you something. You don't have to say anything, you know why? Cause you can pick up all your stuff, because you're mother-fucking fired! | Lemeno.se - En blogg om att Tjäna Pengar På Internet | Min blogg om styrketräning och kost

Permalänk
Medlem

Ska du ha dina kategorier till något annat än bara få dom utskrivna? I så fall hade jag nog stoppat in dom i en trädstruktur först. Då blir det lättare att hantera eftersom kategori-hierarkin existerar i koden på samma sätt som det den beskriver.

Men om det bara är rekursionen du vill få bort och den inte används på andra ställen så kanske inte mitt svar hjälper..

Permalänk
Medlem

Funktionen gör jobbet bäst och snyggast när den är rekursiv, så ge fan i att skriva om den.

Permalänk
Medlem

"Iteration is Human, Recursion is devine"

Visa signatur

AMD Mobile 2400+ @ 2300 Mhz (11,5x200) 1,625 V, Gf4 Ti 4200 @ 360/760, 512mb SP bh-5, Vmodds, vatten och TEC på gpu.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av serp
Funktionen gör jobbet bäst och snyggast när den är rekursiv, så ge fan i att skriva om den.

mm håller med.

Visa signatur
Permalänk
Medlem

Då kan jag väl passa på att fråga varför du vill byta metod?

Visa signatur

Yay!

Permalänk

Det enda du behöver göra är att hantera "stacken" på egen hand.

Pseudo-kod som demonstrerar principen:

# CID (Category ID) of top level parent nodes. const TOP_LEVEL_CID = 0 fun print_children(nodes): # stack entry format = (parent category id, depth in hierarchy) stack = [(TOP_LEVEL_CID, 0)] while stack: parent_cid, depth = stack.pop() for node in nodes: if node['parent_cid'] == parent_cid: print node['name], node['cid'] stack.append( (node['cid'], depth+1) )