2016-07-09 72 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

谢谢!我掌握了逻辑。 –