GO语言复合类型05---递归

package main

import (
	"fmt"
	"time"
)

/*
·递归就是自己调自己
·递归一定要有终止条件(否则就是无限死循环)
*/

/*使用循环求连续自然数的和*/
func GetSumLoop(n int) int {
	var sum int
	for i := 1; i <= n; i++ {
		sum += i
	}
	return sum
}

/*递归实现求连续自然数的和*/
func GetSumRecursive(n int) int {
	if n == 1 {
		return 1
	}
	return n + GetSumRecursive(n-1)
}

/*
斐波那契数列
1 1 2 3 5 8 13 21 34...
*/
func GetFibonacciRecursively(n int) int {
	if n == 0 || n == 1 {
		return 1
	}
	return GetFibonacciRecursively(n-1) + GetFibonacciRecursively(n-2)
}

/*
使用纯循环求斐波那契数列
*/
func GetFibonaciiLoop(n int) int {
	var a, b = 1, 1
	for i := 0; i < n; i++ {
		a, b = b, a+b
	}
	return a
}

func main() {
	//sum := GetSumRecursive(10)
	//fmt.Println(sum)

	/*递归算斐波那契数列耗时*/
	startTime := time.Now().UnixNano()
	for i := 0; i < 50; i++ {
		fmt.Println(GetFibonacciRecursively(i))
	}
	endTime := time.Now().UnixNano()
	fmt.Println("共耗时%d纳秒", endTime-startTime)

	/*循环算斐波那契数列耗时*/
	//startTime := time.Now().UnixNano()
	//for i := 0; i < 1000; i++ {
	//	fmt.Println(GetFibonaciiLoop(i))
	//}
	//endTime := time.Now().UnixNano()
	//fmt.Println("共耗时%d纳秒", endTime-startTime)

	/*
	递归算法
	优点:代码简洁
	缺点:效率相比简单循环慢很多
	*/
}

  

原文地址:https://www.cnblogs.com/yunweiqiang/p/11830641.html