2017-07-07 4 views
0

Dies ist mein Code:Funktion kepps nach der Rückkehr (Rekursion C)

int Binary (int* arr, unsigned int size, int num) 
{ 

    if (0 == size) 
    { 
     return -1; 
    } 
    if (1 == size) 
    { 
     if (arr[0] == num) 
     { 
      return 0; 
     }  
     return -1; 
    } 

    size/= 2; 
    if (num == arr[size]) 
    { 
     return size; 
    } 
    else 
    { 
     if (num < arr[size]) 
     { 
      Binary (arr, size, num); 
     } 
     else 
     { 
      Binary (&arr[size+1], size, num); 
     } 
    } 

    return -1; 
} 

Es funktioniert nicht. Wenn ich es debuggen (versucht, eine Zahl zu suchen, die in einem Array erscheint), sehe ich, dass es in die Zeile 'return size' geht, was es tun sollte (Nebenfrage - gibt es eine Möglichkeit, Zeilennummern in die Code ..) aber dann geht es weiter zur letzten Zeile und gibt -1 zurück. Wie kommt es, dass ich eine Rückkehr habe und es nicht aus der Funktion geht? Ich habe zuerst versucht, keine Rückkehr am Ende, weil ich nicht bis zum Ende erreichen soll, aber der Compiler sagt "Kontrolle erreicht Ende der nicht-void-Funktion", so fügte ich die letzte Rückkehr, aber offensichtlich ist es nicht die richtige zu tun ..

Dank

+0

Es ist unmöglich zu sagen, weil Sie nicht erwähnt, was Debugger Sie verwenden. Es ist jedoch wahrscheinlich, dass die Rückkehr von einer der rekursiven Rufstellen des "if" erfolgte, und der nächste Schritt nach dem Ruf war die Rückkehr -1; – Gene

+0

'Binary (& arr [Größe + 1], Größe, Anzahl);' ist falsch. : ZB "int a [] = {11,22}; int index = Binär (a, 2, 33); '==>' size/= 2; ':' size' wird zu '1' ==> 'Binary (& arr [size + 1], size, num);' ==> 'Binary (& arr [1 + 1], 1, 33);': '& arr [1 + 1]' ist außerhalb der Grenzen. – BLUEPIXY

Antwort

3

Sie sollten die Ergebnisse der rekursiven Aufruf zurückgeben

int Binary (int* arr, unsigned int size, int num) 
{ 

    if (0 == size) 
    { 
     return -1; 
    } 
    if (1 == size) 
    { 
     if (arr[0] == num) 
     { 
      return 0; 
     }  
     return -1; 
    } 

    size/= 2; 
    if (num == arr[size]) 
    { 
     return size; 
    } 
    else 
    { 
     if (num < arr[size]) 
     { 
      return Binary (arr, size, num); // Added return 
     } 
     else 
     { 
      return Binary (&arr[size+1], size, num); // Added return 
     } 
    } 
} 
+2

Die beste Alternative ist, die Rekursion vollständig loszuwerden. Wenn das aus Gründen, die nicht bekannt sind, keine Option ist, würde ich den letzten Teil der Funktion schreiben, so dass die Zeiger- und Größenvariablen im Voraus vorbereitet werden. Am Ende steht dann eine einzelne Return-Anweisung mit dem rekursiven Aufruf. Ansonsten würde ich Compilern nicht trauen, diesen Code richtig zu optimieren, was bedeutet, dass er nicht inline ist. Das bedeutet, dass es ein langsames, buggy Durcheinander sein wird. – Lundin

0

Ersetzt rekursiven Aufruf an:

return Binary (arr, size, num); 
//^^^^^^ 

Derzeit sind Sie nur die Funktion aufrufen und den Rückgabewert ignorieren.


aber dann hält es in die letzte Zeile und returns -1 gehen.

Es ist eigentlich die Eltern gehen in return -1

+0

Irgendein Grund für das Downvote? Der OP-Code sollte "return" enthalten. Was erwartest du, antwortest du nicht oder postest den kompletten Code? –