2016-07-20 8 views
0

Unten sind zwei ähnliche Beispiele, die eine rekursive Funktion definieren, die die Ziffern einer Zahl, die kleiner als 5 sind, druckt und sie auch zählt.Das Zuweisen eines Funktionsaufrufs zu einer Variablen in einer Rekursion führt zu einer anderen Ausgabe

Eingang: 12345
Ausgabe: 1234: 4 // Es gibt 4 Ziffern kleiner als 5


#include <stdio.h> 

int function(int n) { 
    if(!n) return 0; 

    int r = function(n/10); 

    if ((n%10) < 5) { 
     printf("%d", n%10); 
     return r+1; 
    } 
    else return r; 
} 

int main() { 
    int x; 

    scanf("%d", &x); 
    printf(" : %d\n", function(x)); 

    return 0; 
} 


zweiten Code, der die gleiche Funktionalität , aber druckt alles umgekehrt Ich kann es nicht verstehen. Ich bin nicht fließend in der Programmierung und immer noch neu, so dass ich hoffe, die Frage wird klar angegeben.

Eingang: 12345
Ausgabe: 4321:. 4


#include <stdio.h> 

int function(int n) { 
    if(!n) return 0; 

    if(n%10<5) { 
     printf("%d", n%10); 
     return function(n/10)+1; 
    } 
    return function(n/10); 
} 

int main() { 
    int x; 

    scanf("%d", &x); 
    printf(" : %d\n", function(x)); 

    return 0; 
} 
+0

Vergleichen Sie die beiden Codes. Was machen sie anders? Da sich Ihre Frage auf die Reihenfolge der Ausgabedaten bezieht, achten Sie besonders auf die Reihenfolge der Vorgänge. Tipp: Das Funktionsergebnis einer Variablen zuzuweisen, hat an sich nichts damit zu tun. Es wäre auch nicht schwer, den zweiten Code neu zu schreiben, ohne sein beobachtbares Verhalten zu ändern. –

+0

Versuchen Sie, es mit einem Bleistift und einem Stück Papier auszuarbeiten. Was passiert, wenn Sie die Funktion aufrufen (12345)? Für Fall 2 schlägt es den Test n% 10 <5 fehl, also ruft es als nächstes auf (1234). das den Test besteht, druckt also "4". Und so weiter. – FredK

Antwort

0

Im ersten Beispiel Sie Funktion vor dem Drucken rufen, so Anrufe und Drucke in dieser Reihenfolge geschehen:

call function(12345) 
> call function(1234) 
>> call function(123) 
>>> call function(12) 
>>>> call function(1) 
>>>>> call function(0) 
>>>>>> immediate return 
>>>>> print 1 
>>>> print 2 
>>> print 3 
>> print 4 
> no print 

Im zweiten Beispiel drucken Sie zuerst und dann Funktion aufrufen, so Auftrag ist:

call function(12345) 
> no print 
> call function(1234) 
>> print 4 
>> call function(123) 
>>> print 3 
>>> call function(12) 
>>>> print 2 
>>>> call function(1) 
>>>>> print 1 
>>>>> call function(0) 
>>>>>> immediate return 
0

Auch wenn ich mit Rekursion umgehen möchte, habe ich manchmal noch Schwierigkeiten bei der In int r = function(n/10);, Ihre Funktion geht bis klopfen gegen 0. Wenn sie wegen der Stapelstruktur geschlagen werden, kommt Zahlen 1-2-3-4-5 in dieser Reihenfolge. (Schau LIFO). In dieser Reihenfolge gehen 1-2-3-4-5. Für zweiten Code, nach der Überprüfung if(n%10<5) Sie laufen bereits zuerst printf("%d", n%10);, so dass es mit 5-4-3-2-1 beginnt dann runnig function(n/10)+1;, so teilt es wieder 1234/10, 123/10, .... in Prozess bis Klopfen gegen 0. IMHO, Rekursion kann besser verstanden werden, wenn man Stapelstruktur gut bekommt.