C und while? Wieso macht der Author das so?



  • Servus,

    am Anfang möchte ich mich für den Titel entschuldigen und falls jemand etwas besseres einfällt, bitte ich ihn, diesen zu ändern.

    Im Wikipedia-Artikel zur binär Suche liefert der Author zwei Beispiele:

    Java:

    package org.wikipedia.de;
    
    public final class BinäreSuche {
    
        public static int suche(final char zeichen, final char[] alphabet) {
            int ergebnis = -1;
            int erstes = 0;
            int letztes = alphabet.length - 1;
    
            while (erstes <= letztes && ergebnis < 0) {
                final int mitte = erstes + ((letztes - erstes) / 2);
                if (alphabet[mitte] < zeichen) {
                    erstes = mitte + 1; // rechts weitersuchen
                } else if (alphabet[mitte] > zeichen) {
                    letztes = mitte - 1; // links weitersuchen
                } else {
                    ergebnis = mitte; // Zeichen gefunden
                }
            }
    
            return ergebnis;
        }
    
    }
    

    C:

    /**
     * Liefert 1 zurück, wenn X in M gefunden wurde, ansonsten 0.
     * Beim Aufruf wird als 4. Argument eine Variable per Adresse
     * übergeben, in die bei Erfolg die Position von X in M geschrieben wird.
     * @param const int[] M      Feld, in dem gesucht werden soll
     * @param int n              Größe des Feldes
     * @param int X              der gesuchte Eintrag
     * @param int *index         Position des gesuchten Eintrags X in M
     * @return int 1=gefunden, 0=nicht gefunden
     */
    int binary_search(const int M[], int n, int X, int *index)
    {
        unsigned int mitte;
        unsigned int links = 0; /* man beginne beim kleinsten Index */
        unsigned int rechts = n - 1; /* Arrays sind 0-basiert */
    
        if (M == NULL || n <= 0 || X < M[0] || X > M[n - 1]) /* Bereichsüberprüfung */
        {
            return 0;	
        }
    
        while (1) /* Die endlose Schleife wird durch returns Unterbrochen */
        {
            mitte = links + ((rechts - links) / 2); /* Bereich halbieren */
    
            if (rechts < links) /* alles wurde durchsucht, aber X nicht gefunden */
            {
                 printf("Nicht gefunden!\n");
                 return 0;
            }
    
            if (M[mitte] == X) /* Element X gefunden? */
            {
                *index = mitte;
                return 1;
            }
    
            if (M[mitte] > X)
                rechts = mitte - 1; /* im rechten Abschnitt weitersuchen */
            else
                links = mitte + 1; /* im linken Abschnitt weitersuchen */
        } 
    }
    

    Wieso schreibt der Author in C folgendes

    while (1)
    

    und nicht

    while (rechts < links)
    // + ein paar Anpassungen
    

    ? 😕

    Ist der Grund auf der Performance-Seite zu suchen?
    Und da hätte ich noch ne Frage. Spielt es in C eine Rolle, ob ich rekursiv oder in einer Schleife ein Problem löse?

    Gruß,
    Thomas



  • ich vermute er hats so geschrieben, damit er im fall rechts < links noch eine meldung ausgeben kann, bevor er die schleife abbricht.

    Siassei schrieb:

    Spielt es in C eine Rolle, ob ich rekursiv oder in einer Schleife ein Problem löse?

    ja.



  • solange(wahr); schrieb:

    Siassei schrieb:

    Spielt es in C eine Rolle, ob ich rekursiv oder in einer Schleife ein Problem löse?

    ja.

    ... und zwar insofern, das pro rekursivem Funktionsaufruf ein neuer Stackframe erzeugt wird.
    Iterationen laufen dagegen mit konstantem Stackspace.



  • Servus,

    danke für eure Antworten.

    Gruß,
    Thomas



  • Siassei schrieb:

    Wieso schreibt der Author in C folgendes

    while (1)
    

    und nicht

    while (rechts < links)
    // + ein paar Anpassungen
    

    weil eine endlosschleife den code manchmal einfacher/leserlicher macht (z.b. diese zwei entscheidungen, wann rausgesprungen wird).
    🙂



  • while(rechts>=links) wäre tatsächlich besser. Der Autor hat das Beispiel einfach schlecht programmiert.


Anmelden zum Antworten