Rekursion -> Websitepages

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Rekursion -> Websitepages

    Hallo.

    Ich stehe gerade irgendwie auf dem Schlauch.

    Ich habe Seiten, die enthalten Hauptkategorien.
    Diese Hauptkategorien haben Unterkategorien und die Unterkategorien haben
    teilweise mehrere Unterkategorien.

    Was ich also brauche, ist eine rekursive Suche.

    -LoadInterestBasicCategories lädt die ersten Hauptkategorien.



    Was mache ich da falsch?
    Aufrufen tue ich die Funktion

    VB.NET-Quellcode

    1. LoadInterests()

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin Hombre“ ()

    Kevin Hombre schrieb:

    Was mache ich da falsch?
    Du sagst es selbst:

    Kevin Hombre schrieb:

    Was ich also brauche, ist eine rekursive Suche.
    Ich finde in deim gezeigten Code aber keine rekursive Suche.

    Vlt ein paar grundlegende Gedanken zum Thema Rekursion? Bäume durchlaufen mit Rekursion
    Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.[/b]

    in :

    VB.NET-Quellcode

    1. MainPages.AddRange(LoadInterestMainCategories(c.MainCategoryId))



    :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin Hombre“ ()

    Du kannst keine Auflistung bearbeiten, die du gerade durchenumerierst. Leg dir ne neue Auflistung an und füge die beiden dann am Ende zusammen.
    Oder du baust das ganze gleich so um, dass gar keine Rekursion mehr gebraucht wird. Ist zwar etwas Arbeit, macht den Algorithmus aber wesentlich effizienter.
    Ok,
    hab mir das mit der Rekursion nochmal angeschaut..
    Edit: Hab es.


    System.StackOverflowException



    So ist es doch eigentlich richtig vom Code her.. Dachte ich zumindest.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin Hombre“ ()

    Das kann dir halt passieren, wenn du mit Rekursion arbeitest. Jeder erneute Aufruf an die Funktion verbraucht zusätzlichen Speicher auf dem Callstack.
    Deswegen meinte ich ja, du solltest versuchen es so umzubauen, dass keine Rekursion mehr benötigt wird.
    Ich hab keine Ahnung, wie ich das ohne Rekursion machen könnte.

    Ich meine, da sind Seiten, die haben halt Hauptkategorien.
    Diese Hauptkategorien haben wieder Unterhauptkategorien die ebenfalls Unterkategorien enthalten
    usw.


    Wenn Du einen konkreten Vorschlag hast, gerne.
    Es ist grundsätzlich immer möglich, einen Rekursiven Algorithmus in einen nicht-rekursiven umzuwandeln. Wie man das genau anstellt, hängt immer von der Situation ab. In Permutation ohne Rekursion zeige ich zum Beispiel, wie man aus einem rekursiven Algorithmus für Permutation einen nicht-rekursiven erstellt.
    anne Rekursion liegts m.E. nicht, dass der Overflow kommt - höchstens an eine falsche Implementation - der Code hier ist mir zuviel - da blick ich nicht durch.
    Es kann an den Daten liegen, dass eine Rekursion im Kreis geht, und dann gibts beim iterativen Ansatz ebenfalls Ärger - vlt. sogar MemoryFull oder sowas.

    Aber hier ists bestimmt eine falsche Implementierung, denn StackOverFlow kommt doch erst in hundert- oder tausendfacher Rekursions-Tiefe.
    Kann also hier garnet richtig gelaufen sein, weil er will ja rekursiv WebSites abrufen, und 1000 Websites - das hätteja Stunden gedauert.
    Danke für die Antworten ersteinmal.


    @ Artentus: Ok, Du hast es aber sehr schlicht mit Ziffern gehalten.

    Hier sind das schon ein paar andere Verhältnisse.


    Eventuell versteht den Code jemand und kann mir was dazu sagen?

    Ich komm irgendwie nicht weiter.
    Irgendwie wird mir nicht klar, wie das vom Ablauf her funktionieren soll.

    Also in deinem Beispiel das mit der Permutation verstehe ich,
    aber wie das hier in meinem Fall mit dem Suchen gehen soll, keine Ahnung.

    Kannst Du mir das Pseudo mal schreiben(ohne Code) für dieses Beispiel von mir?
    #54

    Und damit ist imo auch der Stackoverflow offensichtlich.

    Also um prinzipiell eine rekursive Methode zu entwickeln täte ich Subs nehmen, weil Rückgabewerte verkomplizieren die Sache.
    Und dann klassenweit eine List(Of ResultType) anlegen. Diese Liste hat für die Rekursion keine Bedeutung, da werden halt nur die Treffer drin gebunkert.

    Ein Result muß iwas sein, was einerseits ein Ergebnis einer Suche ist (eins von mehreren), annererseits aber auch der Input einer Suche. Also ein Result in die Suche eingegeben muß mehrere neue Results generieren.
    einfaches Beispiel:

    VB.NET-Quellcode

    1. Dim _DirList As New List(Of DirectoryInfo)
    2. Public Sub recurse(dirs As IEnumerable(Of DirectoryInfo))
    3. For Each dirinf In dirs
    4. _DirList.Add(dirinf)
    5. recurse(dirinf.EnumerateDirectories)
    6. Next
    7. End Sub