2016-07-09 101 views
0

我正在學習Golang,並且我試圖理解遞歸函數輸出背後的邏輯。算法:瞭解遞歸函數

這裏是我的程序:

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) 

} 

輸出:

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

我的問題是:

爲什麼第一輸出(突破500)在輸出的頂部?是不是我的功能中的最後一個輸出被打印?

爲什麼在主函數

j = rec(1) 

返回1,並忽略條件的回報?

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

PS:我使用Ubuntu 14.04下

謝謝您的回答轉到版本go1.2.1 LINUX/386。

回答

3

這條線在func rec(i int)功能

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

遞歸遍歷我,直到達到5,在這之後你如果條件觸發,這就是爲什麼5先打印,然後依次下降,通過調用堆棧,打印4,然後3,...等。

這是一個問題re遞歸,而不是專門去。有很多資源可以幫助你理解,下面是對Towers of Hanoi problem遞歸的解釋。

+1

@ nexus66因爲你的函數遞歸地返回5,然後4,然後3 ...等等。所以你的j變量等於5,然後它被覆蓋到4,然後3,...,直到它命中1,你打印的。 – ifma

+0

謝謝!我掌握了邏輯。 –