递归

/*

函数自己调用自己就是递归.
*/

连续自然数的和

/*
求1+2+3+4....+n的和

 */

循环实现

 1  //循环实现
 2 package main
 3
 4 import "fmt"
 5
 6 func main() {
 7
 8     fmt.Println(GetSum(10))
 9
10 }
11 func GetSum(n int) (sum int) {
12     for i := 1; i < n+1; i++ {
13         sum += i
14     }
15     return
16 }

递归实现

 1 /*
 2 递归实现
 3 递归一定要有终止条件,一路递出去,一路归回来。
 4
 5 实现逻辑
 6 f自己调用自己
 7 f(10)调用f(9)  f(9)调用f(8)...f(2)调用f(1)
 8 f(10)= 10+f(9) = 9+f(8) = 8+f(7) ....2+f(1)
 9
10 */
11
12 package main
13
14 import "fmt"
15
16 func main() {
17     fmt.Println(f(10))
18 }
19
20 func f(n int) (sum int) {
21
22     //终止条件,由递转归
23     if n == 1 {
24         return 1
25     }
26
27     //自己调用自己
28     return n + f(n-1)
29
30 }

递归 比较  循环

 1 /*
 2 递归比较循环
 3 拿f(10)来比较
 4 循环方式是 循环了10次。
 5 递归方式是 来回搞了20次。
 6
 7 */
 8
 9
10 //递归方法
11
12 package main
13
14 import (
15     "fmt"
16     "time"
17 )
18
19 func main() {
20     TimeIt(f, 100000)
21 }
22
23 func f(n int) (sum int) {
24
25     //终止条件,由递转归
26     if n == 1 {
27         return 1
28     }
29
30     //自己调用自己
31     return n + f(n-1)
32
33 }
34
35 func TimeIt(f func(int) int, arg int) {
36     StartTime := time.Now()
37     f(arg)
38     EndTime := time.Now()
39
40     fmt.Println("执行耗时: ", EndTime.Sub(StartTime))
41
42 }
43
44 //执行耗时:  22.94ms
 1 //循环方式
 2 package main
 3
 4 import (
 5     "fmt"
 6     "time"
 7 )
 8
 9 func main() {
10     TimeIt(GetSum, 100000)
11 }
12
13 func GetSum(n int) (sum int) {
14     for i := 1; i < n+1; i++ {
15         sum += i
16     }
17     return
18 }
19
20 func TimeIt(f func(int) int, arg int) {
21     StartTime := time.Now()
22     f(arg)
23     EndTime := time.Now()
24
25     fmt.Println("执行耗时: ", EndTime.Sub(StartTime))
26
27 }
28
29 // 执行耗时:  0s
01-07 13:36