2016-07-09 5 views
0

Ich lerne Golang und ich versuche, die Logik hinter der Ausgabe einer rekursiven Funktion zu verstehen.Algorithmus: Grundlegende rekursive Funktion

Hier ist mein Programm:

package main 

import(
    "fmt" 
) 

func rec(i int) (int){ 
    if i == 5{ 
     fmt.Println("Break", i) 
     return i 
    } 

    rec(i+1) 
    fmt.Println("i = ", i) 

    return i 
} 

func main(){ 
    j := 0 
    j = rec(1) 

    fmt.Println("Value j = ", j) 

} 

Der Ausgang:

Break 5 
i = 4 
i = 3 
i = 2 
i = 1 
Value j = 1 

Meine Fragen sind:

Warum der erste Ausgang (5 Pause) in der Spitze der Ausgänge ist? Wird nicht die letzte Ausgabe in meiner Funktion gedruckt?

Und warum in der Hauptfunktion

j = rec(1) 

Rückkehr 1 und die Rückkehr der Bedingung ignorieren?

if i == 5{ 
     fmt.Println("Break", i) 
     return i // Here normally the return will be: return 5 ?? 
    } 

PS: Ich bin mit Go Version go1.2.1 linux/386 unter Ubuntu 14.04

Vielen Dank für Ihre Antworten.

Antwort

3

Diese Zeile in der func rec(i int) Funktion

rec(i+1) // recurse at the i+1 value 
fmt.Println("i = ", i) 

Recursively Iterierten i bis erreicht es 5, nach welcher, wenn die Bedingung Auslöser, weshalb 5 zuerst gedruckt wird, und dann nacheinander geht es nach unten durch den Call-Stack , Drucken 4, dann 3, ... usw.

Dies ist eine Frage re Rekursion, nicht speziell gehen. Es gibt zahlreiche Quellen, die Ihnen helfen, zu verstehen, hier ist eine Erklärung der Rekursion in der Towers of Hanoi problem.

+1

@ nexus66 Weil Ihre Funktion rekursiv 5, dann 4, dann 3 ... usw. zurückgibt. Also war Ihre j-Variable zuerst gleich 5, dann wird sie auf 4, dann 3, ... überschrieben, bis sie trifft 1, die du druckst. – ifma

+0

Danke! Ich habe die Logik dahinter. –