// da vi er tilbage i et tidligere kald, skal vi bruge det rigtige dataset s.Pop();
// datasettet nulstilles k_DataSet.Reset();
// datasettet vil nu være som det var før k_DataSet = ((DataSet)s.Peek()).Copy(); } } }
Funktionen skal bruges til at lave en preorder traversering af en generel træstruktur. Problemet ligger i at den går hele vejen ned i venstre side, og så hele vejen op igen til root og holder så. Det virker som om den ikke fortsætter i lækken når man kommer tilbage fra et af de tidligere kald.
Jeg kan ikke lige se problemstillingen i at det skulle hjælpe mig, kan du ikke uddybe det lidt mere, det kan godt være jeg fumler rundt i om det er preorder eller hvad det er. Rækkefølgen skal være:
antal_kategorier er global!!!!! Prøv selv at gæt hvad der sker nå du er løbet til ende i dit træ, og den kaldende funktion skal sammenligne: for (int i = 0;i<antal_kategorier-1;++i)
Så næste gang du benytter dig af rekursive funktioner, så har du vel lært at globale variable er noget skidt, ie. svært at styre. Og det værste er at de gør funktionen meget sværere at gennemskue. Selv for den der skrev den ;-)
Hvis performence er vigtig for dig, så drop brugen af rekursive funktioner.
weeee nu begynder det at ligne noget, hvad gør jeg for at løse det. kan jeg flytte den et andet sted hen, eller er jeg nødt til at bruge en datastruktur til at gemme det undervejs
Prøv at bruge en lokal variabel, du kan evt kalde den antal_kategorier ;-) Dvs at du i starten af din funtion skriver: int antal_kategorier; eller længere nede int antal_kategorier = k_DataSet.Tables["Kategori"].Rows.Count;
Præcis lige som i Java.
For lige at summere op: Der er INGEN problemer med køretids-stakken. lokale variable ER lokale variable, også i rekursive funktioner.
Det er OK at din kategori-stak er global. Alle andre variable i din funktion bør være lokale.
I øvrigt er der ikke behov for en kategori-stak i det hele taget, netop fordi din implementering er rekursiv. Og derfor kender hvert funktionsniveau sine underkategorier. Stakken kan bruges hvis du ønsker at samle træstrukturen op, for senere gennemløb.
nu nærmer vi os en løsning, jeg har fjernet den globale antal_kategorier og sagt int antal_kategorier = k_DataSet.Tables["Kategori"].Rows.Count; istedet, og får nu følgende output.
vi er nu i knuden: 11 SELECT * from Kategori WHERE parent = 11
antal_kategorier er nu: 3 i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 12 SELECT * from Kategori WHERE parent = 12
antal_kategorier er nu: 3 i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 15 SELECT * from Kategori WHERE parent = 15
antal_kategorier er nu: 2 i er nu:(før vi kalder rekusivt) 0vi er nu i knuden: 18 SELECT * from Kategori WHERE parent = 18 slutnode
Vi er nu tilbage i et tidligere kald, knude 15
Vi er nu tilbage i et tidligere kald, knude 12
antal_kategorier er nu: 3 i er nu:(før vi kalder rekusivt) 1vi er nu i knuden: 16 SELECT * from Kategori WHERE parent = 16 slutnode
Vi er nu tilbage i et tidligere kald, knude 12
Vi er nu tilbage i et tidligere kald, knude 11
antal_kategorier er nu: 3 i er nu:(før vi kalder rekusivt) 1vi er nu i knuden: 13 SELECT * from Kategori WHERE parent = 13
Den fejl fandt jEg selv, ups. Opret et svar og du får point, jeg ved ikke helt hvordan jeg skal udtrykke hvor glad jeg egentligt er. Har bøvlet med det krat i meget meget lang tid.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.