Binärsuche Fehlersuche



  • Jockelx schrieb:

    Auch ein rekursiver Funktionsaufruf ist ein Funktionsaufruf.
    Ersetz doch mal die unteren 'bin_search_rek'-Aufrufe durch 'ich_bin_nicht_rekursiv'.
    Was passiert dann?

    ´

    Dann kommt ein Fehler, weil es diese Funktion nicht gibt.

    manni66 schrieb:

    Liefern alle optionen einen Wert zurück?

    Ja, eigentlich doch schon, weil es nur zwei Optionen gibt: Entweder wird das Element gefunden oder nicht. WEnn nicht, dann wird rechts kleiner als links.

    Worauf wollt ihr hinaus? Welche Option übersehe ich denn? Mitte könnte 0 werden...mmmh...ne, das ist es nicht. Was übershee ich.....?? 😮

    Danke



  • freakC++ schrieb:

    Jockelx schrieb:

    Auch ein rekursiver Funktionsaufruf ist ein Funktionsaufruf.
    Ersetz doch mal die unteren 'bin_search_rek'-Aufrufe durch 'ich_bin_nicht_rekursiv'.
    Was passiert dann?

    ´

    Dann kommt ein Fehler, weil es diese Funktion nicht gibt.

    Scherzkeks.
    Das sollst du im Kopf machen -oder definiere dir die Funktion, die dann z.B. stumpf true zurückliefert.



  • Die Warnung lautet: "Nicht alle Steuerelementpfade geben einen Wert zurück."

    Geh doch mal alle vier Pfade in deinem Funktionskörper durch und schaue, ob du in dem jeweiligen Pfad einen Wert zurückgibst.



  • Jockelx schrieb:

    Scherzkeks.
    Das sollst du im Kopf machen -oder definiere dir die Funktion, die dann z.B. stumpf true zurückliefert.

    Achso. Sorry. Ich hatte deinen Punkt nicht verstanden.

    Ich schätze mal, es liegt einfach daran, dass ich kein "return" beim rekursiven Aufruf geschrieben habe. Toooollll. Ich dachte, dass es ein logischer Fehler wäre und habe sowas Banales gar nicht in Erwägung gezogen. Danke für die Hilfe.

    lg, freakC++



  • Fliegt eigentlich "mitte" beim rekursiven Aufruf vom Stack, also wird der Speicherplatz wieder freigegeben? Sonst wäre das nicht gerade schön, da sonst bei jedem Funktionsaufruf eine neue Variable angelegt wird.

    lg, freakC++



  • Natürlich wird mitte bei jedem Aufruf angelegt und erst aufgeräumt, wenn die jeweilige Funktion fertig ist.
    Ganz genauso wie bei anderen Funktionsaufrüfen auch.


  • Mod

    freakC++ schrieb:

    Fliegt eigentlich "mitte" beim rekursiven Aufruf vom Stack, also wird der Speicherplatz wieder freigegeben? Sonst wäre das nicht gerade schön, da sonst bei jedem Funktionsaufruf eine neue Variable angelegt wird.

    Da du hier eine sogenannte Tailrekursion hast, ist es möglich, dass dies optimiert wird. Das ist aber schon eine der heftigeren Optimierungen, die bei den gängigen Compilern erst in den höheren Optimierungsstufen aktiviert werden. GCC und MSVC können das jedenfalls.

    Wenn du dich drauf verlassen willst, dass alles optimal ist, dann musst du deinen Algorithmus von Hand zu einer Schleife umschreiben. Das ist auf jeden Fall möglich, das ist das was der Compiler bei der oben beschriebenen Optimierung tut.



  • freakC++ schrieb:

    Fliegt eigentlich "mitte" beim rekursiven Aufruf vom Stack, also wird der Speicherplatz wieder freigegeben? Sonst wäre das nicht gerade schön, da sonst bei jedem Funktionsaufruf eine neue Variable angelegt wird.

    Das ist hier relativ egal, da die Rekursionstiefe sich logarithmisch zur Größe des Arrays verhält.



  • SeppJ schrieb:

    Wenn du dich drauf verlassen willst, dass alles optimal ist, dann musst du deinen Algorithmus von Hand zu einer Schleife umschreiben.

    Also iterativ lösen?


  • Mod

    freakC++ schrieb:

    SeppJ schrieb:

    Wenn du dich drauf verlassen willst, dass alles optimal ist, dann musst du deinen Algorithmus von Hand zu einer Schleife umschreiben.

    Also iterativ lösen?

    Wenn du sicher sein willst, dass es immer optimiert wird: Ja. Es gibt hier schließlich keinen zwingenden Grund zur Rekursion, außer, dass es hübscher aussieht. Beziehungsweise: Wenn du es iterativ löst, gibt es gar keinen Grund mehr zur Optimierung, weil das schon die Optimierung ist.


Anmelden zum Antworten