2017-11-28 11 views
0

Also, vor allem bin ich ein absoluter Anfänger in C, wir studieren es an der Universität im Kurs 'Strukturierte Programmierung'.Rekursive Funktionen in C und printf

Jetzt waren die letzten Vorträge über 'Rekursive Funktionen' für mich als Anfänger ein Schmerz. Könnte jemand von euch so freundlich, mir zu erklären, dies:

Also habe ich dieses kleine Skript, eine rekursive Funktion, die eine Dezimalzahl nimmt und wandelt sie in eine binäre Eins:

#include <stdio.h> 

void binary(int num) 
{ 
    if (num == 0) return; 

    binary(num/2); 
    printf("%d", num % 2); 
} 

int main() 
{ 
    int n; 
    scanf("%d", &n); 
    binary(n); 
    return 0; 
} 

Jetzt habe ich mich gefragt , wie funktioniert diese Funktion? Ich kenne die Logik dahinter und was es tun soll, aber ich weiß nicht, wie es IT macht. Der printf im unteren Bereich wirft mich besonders aus, zum Beispiel, wenn die printf-Funktion vor dem rekursiven Aufruf ist, für die Eingabe-Dezimalstelle 10 (0101), aber wenn darunter die richtige Binärzahl (1010) ausgedruckt wird?

Jede Art von Hilfe wird sehr geschätzt, mit freundlichen Grüßen.

+5

"Ausführen" Sie Ihr Programm naiv "von Hand" mit einem Bleistift und einem Stück Papier, und Sie werden es verstehen. –

Antwort

0

Die Stornierung erfolgt über den Aufruf-Stack der Funktionen. Damit meine ich, dass die Art, wie die Funktionen aufgerufen werden, garantiert, dass die MSB zuerst gedruckt wird, dann die nächste und so weiter.

void binary(int num) 
{ 
    if (num == 0) return; 

    binary(num/2); // Wait, I will print but you first print the MSB's. 
    printf("%d", num % 2); // Now I print the last digit. 
} 

Abwärtsbewegung bewegt sich die Anrufe.

{binary(12)      
    {binary(6)     
     {binary(3)   
     {binary(1) 
      binary(0) -- returns 
     Now we print 1 
     } 
     print 1 
     } 
    prints 0 
    } 
prints 0 
} 
+0

Ich war mir dessen nicht bewusst, aber dank dir und @Michael Waltz ist es jetzt viel klarer. Ich werde einige Zeit damit verbringen, mehr über den Call-Stack zu lesen, danke. – Baron