[RUBY] Ein grundlegendes Verständnis des Flusses der rekursiven Verarbeitung anstreben

Selbst wenn ich die Codebeschreibung über die rekursive Funktion gelesen habe, die "mich selbst aufruft", konnte ich sie nicht einholen. Deshalb schrieb ich mit meiner eigenen Vorsicht einen Artikel mit dem Thema "ein grundlegendes Verständnis des Flusses der rekursiven Verarbeitung anstreben". Ich würde gerne ausprobieren. Lassen Sie uns darüber nachdenken, wie die Funktion mit dem folgenden einfachen Code ausgeführt wird.

Rekursive Funktion

1  def recursive(n)
2     p 'a'
3     p n
4     return 1 if n == 0
5     p n
6     n * recursive(n - 1)
7     p 'b'
8     p n
9  end
10 
11  p recursive(5)

Bei der Ausführung ist es wie folgt. recursive1.png

Auf den ersten Blick war ich verwirrt, weil ich keine Ahnung hatte, warum sich die Zahl von 0 erhöhte. Während ich mir vorstelle, dass "eine Funktion eine Funktion enthält", werde ich versuchen, den Mechanismus einer rekursiven Funktion auszugeben, indem ich sie auf meine eigene Weise kaue, wie unten gezeigt.

Rauer Fluss

(1) Funktionsausführung mit 5 als Argument → (2) p "a" bis p n in der 5. Zeile werden ausgeführt (* Natürlich wird der Postfix, wenn die Anweisungsrückgabe nicht ausgeführt wird) → (3) In der 6. Zeile wird eine eigene rekursive Funktion (4) ausgeführt. → Wie bei der (4) -Schleife werden die obigen (2) bis (3) bis zur rekursiven (0) ausgeführt. (* Zu diesem Zeitpunkt wurde "(weggelassen) ..." a ", 1, 1" verarbeitet. ") → (5) Wenn rekursiv (0) ausgeführt wird, wird der Postfix if-Anweisungsrückgabe ausgeführt, nachdem p "a" bis p n in der dritten Zeile ausgeführt wurden. Mit return endet die rekursive (0) Funktionsverarbeitung. → (6) Von hier zurückspulen? Rückläufig? Es wird ein Zustand wie. Die Ausführungsszene kehrt zu rekursiv (1) zurück, "b" in der 7. Zeile und p n (* n ist 1) in der 8. Zeile werden ausgeführt und rekursiv (1) endet. → (7) Die Ausführungsszene kehrt zu rekursiv (2) zurück, "b" in der 7. Zeile und p n (* n ist 2) in der 8. Zeile werden ausgeführt und rekursiv (2) endet. → (Ausgelassen bis rekursiv (4)) → (8) Die Ausführungsszene kehrt zu rekursiv (5) zurück, "b" in der 7. Zeile und p n (* n ist 5) in der 8. Zeile werden ausgeführt, rekursiv (5) endet und alle Funktionen sind abgeschlossen. → (9) Schließlich wird p rekursiv (5) (synonym mit p n) 5 ausgegeben und der Prozess endet. (* Wenn die p-Methode ausgeschlossen ist, werden die letzten 5 nicht ausgegeben.)

... Rekursive Funktionen sind persönlich ziemlich schwer zu verstehen. Ich mache mir ein wenig Sorgen darüber, ob es besser ist, die Anzahl der Plätze zu verwalten und sich daran zu gewöhnen. : verwirrt:

Recommended Posts

Ein grundlegendes Verständnis des Flusses der rekursiven Verarbeitung anstreben
[Swift, ein Muss für Jungvögel! ] Lassen Sie uns die Implementierung der Kommunikationsverarbeitung der Web-API verstehen
Bildverarbeitung: Grundstruktur des vom Programm gelesenen Bildes
[Java] Beim Schreiben der Quelle ... Memorandum ①
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
Wiedereinführung in Java for Humanities 0: Den Akt der Programmierung verstehen
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
[Illustration] Finden der Summe von Münzen mit einer rekursiven Funktion [Ruby]
Verstehen Sie den grundlegenden Mechanismus von log4j2.xml
Eine Liste der rawValues für UITextContentType.
Ein Memorandum über das FizzBuzz-Problem
Reihenfolge der Verarbeitung im Programm
Streben nach praktischer Radix-Sortierung
Verstehe die Lambda-Formel ein wenig
[Rails] Artikel für Anfänger, um den Fluss von form_with zu organisieren und zu verstehen
Überprüfen Sie die Notizen für die Klasse java.util.Scanner
Ich habe die interne Verarbeitung von Retrofit untersucht
[Für mich] Übertragung der Servlet-Klassenverarbeitung
Überprüfen Sie die Notizen für die Klasse java.util.Optional
WebMvcConfigurer-Memorandum von Spring Boot 2.0 (Spring 5)
Ein Überprüfungshinweis für die Klasse java.util.Objects
Vertiefte mein Verständnis der Zusammenführungsmethode
Finden Sie den Unterschied von einem Vielfachen von 10
Überprüfen Sie die Notizen für das Paket java.time.temporal
Behebung des Problems des langsamen Direktzugriffs für linkedList, eine Auflistungstypklasse
Verwenden Sie doch die for-Anweisung? Verwenden Sie die while-Anweisung? Ordnungsgemäße Verwendung von for-Anweisung und while-Anweisung