Reverse-Zahlen-Funktion mit Rekursion in C
Folgende ist eine Funktion, gemeint ist die Rückkehr der Rückseite eine Zahl mit Rekursion. Jedoch, es gibt nur die Letzte Ziffer der Zahl. Ich würde gerne wissen, warum und wie es zu lösen ist?
int rev(int number)
{
int revNum=0, sum=100;
if(number<=9) return(number);
else if(number>0)
{
return(rev(number/10)+revNum);
revNum=(number%10)*sum; sum=sum/10;
}
}
Danke!!!!!
was meinst du mit Rückseite die Anzahl? wie für den code, alles, was nach, dass die return-Anweisung hat keine Bedeutung
er will umkehren der Ziffern, also: 1234 wird zu 4321
BTW: die Letzte Zeile
das problem ist vor allem, weil
if(number<=9)
sonst if(number>0)
was ist das??Es ist etwas zwischen 0-9, die bereit ist, um den Zustand.er will umkehren der Ziffern, also: 1234 wird zu 4321
BTW: die Letzte Zeile
revNum=(number%10)...
wird nie erreichtdas problem ist vor allem, weil
sum
ist nicht erhalten, über Rekursion, unter anderemInformationsquelleAutor Michael Ferashire Silva | 2013-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier einige arbeiten code:
Der Hauptgrund, warum Ihr code konnte nicht arbeiten, andere als das, was ich sagte oben, dass
sum
ist nicht erhalten in den Ausschreibungen. Dies ist ein häufiges problem im rekursiven Funktionen.Abhilfe zu schaffen, die "Basis" berechnet jede Funktion aufrufen, anstatt einen festen Wert. Diese auch ein bisschen besser, weil es erlaubt, eine größere Anzahl übergeben werden, anstatt diejenigen, die nicht größer als
100
(eine weitere Grenze des Codes, den Sie gewählt haben).Einer anderen Implementierung ist die Basis die Basis als zweiten parameter, so dass es nicht neu berechnet werden müssen, jeder Aufruf der Funktion. Dies kann jedoch leicht behoben werden, indem ein einfaches makro. Den Anruf können sein :
Aber eine bequem platziert werden in ein makro (oder eine andere Funktion aufrufen):
Dies ist ein wenig effizienter, aber der Unterschied möglicherweise oder möglicherweise nicht wichtig.
es ist mehr enthalten, aber weniger effizient, da die base berechnet, die bei jedem Anruf.
Ja, aber um ehrlich zu sein - wir sind der Umgang mit rekursiven Funktionen - Funktionsaufrufe sind teuer (und mehrere Parameter machen es nicht besser 😉 ). Ich denke, es ist nur für Lernzwecke: Transformation einer Funktion in eine rekursive Funktion oder Umgekehrt.
Vielen Dank, die Lösung ist glasklar; es sei denn, ich verstehe nicht, was while(Zahl/(Basis*10))?
Der Wert von
number/base*10
1 sein soll für die Schleife ausführenInformationsquelleAutor tay10r
Dies ist die Lösung.
Anruf unter Funktion als
reverse (number, 0);
int
dividieren durch 10 und manint
multiplizieren durch 10, - pro Anzahl der stellen: effizienteste.InformationsquelleAutor monkey
Und es ist getan in einer Zeile.
gut
(num % 10)
ist die Letzte Ziffer so, um es, der erste zu sein, müssen Sie multiplizieren Sie diese mit einem Wert die beginnt mit einer 1, weiterhin mit 0 und hat genau so viele stellen, wie Ihrnum
. Also im Grunde, wenn Ihre Zahl ist123456
,(num % 10) * pow(10, (int)log10(num))
berechnet ersten mal600000' then '50000' and so on. An when the last value which is less then
10` zurückgegeben wird, beginnt es, das hinzufügen der Ergebnisse.ohh... danke für die Aufklärung
warum wird in einer Zeile machen es besser? a) es ist weniger gut lesbar. b) es ist nicht einmal rekursiv
weißt du... ich geprüft, beide von Ihnen, und in Bezug auf Geschwindigkeit, Ihr ist ein wenig schneller, dann von mir. Rund 1,25 mal. Ich denke, es ist, weil der
pow
undlog10
berechnet sich langsam. Also in meinem Fall ist es nur das speichern der hard-Speicher.InformationsquelleAutor Alexandru Barbarosie
Hallo, Eine kleine Korrektur Ihrer code gibt die erste Ziffer(nicht die Letzte Ziffer) der eingegebenen Zahl sind.Hier ist der Grund,
Sind Sie die Berechnung revNum nach der Rückkehr einige Wert wie diese
also die zweite Anweisung hat keine Wirkung.
Auch revNum ist eine lokale variable
Also jedes mal, wenn Sie anrufen, eine rekursive Funktion neue lokale Kopien von Summe(lokale variable) und revNum werden immer erstellt und mit 0 initialisiert und 100 beziehungsweise.
Ihre rekursive Struktur sieht wie folgt aus,Zum Beispiel 596 ist die Anzahl der an die rekursive Funktion.
Nun rev(5) liefert 5(da 5 < 9) an den Aufrufer zurück ich.e rev(59) von dort auf den Anrufer, das ist im wesentlichen, was die Anzeige der ersten Ziffer, in diesem Fall ist es 5.
Wie man es beheben?
Zu beheben, dass Problem, Sie haben, um Sie Globale Variablen(Summe und revNum) auch die return-Anweisung sollte am Ende, nach der Berechnung der umgekehrten Reihe. Hier ist der einfache code.
Machte ich Rückseite variable als Globale variable zu bewahren, die Veränderungen in der es, schließlich bin ich die Rücksendung derselben an den Aufrufer.
Hi Michael, da es eine Globale variable ist, wird es auf null initialisiert,damit in der ersten Zeit rückwärts*10 wird zu null.
Scheitert
rev(0)
als Rückgabewert nicht vorgesehen.InformationsquelleAutor Mahesh
n >= 0
mit anfallendenint
überlaufen wie andere.Vorgeschlagene Vereinfachung:
void reverse(int n) { printf("%d",n%10); if (n >= 10) reverse(n/10); }
}InformationsquelleAutor klement omeri
Kann dieses snippet hilft:
...später Hinzugefügt...
Die rekursive Variante sieht wie folgt aus (ich habe zwei Funktionen, um die gewünschte Unterschrift):
Ich bin sicher, es kann geschrieben werden kürzer/optimiert 😉
*Jost
dies kann funktionieren, aber es tut sich leider keine Rekursion 🙁
oops - Rekursion - ja... ich arbeite dran - sry
es kann getan werden, mit nur einem parameter 😛
ja du hast Recht, aber das zählen der Anzahl der Ziffern der Eingabe irgendwie "text-Verarbeitung" 😉
InformationsquelleAutor Jost
Hier ist die rekursive Lösung:
C
nichtC++
Ich glaube, das ist C++, die ich noch zu lernen habe, sorry 🙁
Oops, my bad! übersetzt es auf c jetzt!
InformationsquelleAutor BKC
Überprüfen Sie diese Rekursion version.
InformationsquelleAutor Amarnath Krishnan