遞迴實現n以內數的和
//遞迴實現求和
func sumRecursion(n int) int{
//定義遞迴返回條件
if n <= 0{
return 0
}
if n == 1{
return 1
}
return n + sumRecursion(n-1)
}複製程式碼
遞迴實現斐波那契數列
func main() {
//輸出10個斐波那契數列
for i:=1;i<=10; i++{
fmt.Println(Fibonacci(i))
}
}
//實現斐波那契數列的函式
func Fibonacci(n int) int{
if n <= 2{
return 1
}
return Fibonacci(n-1) + Fibonacci(n-2)
}複製程式碼
遞迴實現檔案目錄下的所有檔案
//遞迴實現遍歷目錄下的所有檔案
func CatalogRecursion(path string){
//返回FileInfo, error
fi, err := os.Stat(path)
//判斷檔案路徑是否存在
if err != nil{
fmt.Printf("%s不存在", path)
}
//遞迴返回條件
//判斷是否是檔案
if fi.Mode().IsRegular(){
fmt.Printf("檔案是%s\n", path)
}
//遞迴條件
//判斷是否是目錄
if fi.Mode().IsDir(){
//返回切片 []FileIo, error
filos,_ := ioutil.ReadDir(path)
for _, filo := range filos{
//獲取檔名稱
name := filo.Name()
subPath := path + "/" + name
//fmt.Printf("%s下的檔案或目錄是%s\n", path, subPath)
//遞迴
CatalogRecursion(subPath)
}
}
}複製程式碼
遞迴效能
//for迴圈實現求和
func SumFor(n int) int {
sum := 0
for i:=0;i<=n;i++{
sum += i
}
return sum
}複製程式碼
func main() {
starTime := time.Now()
//呼叫遞迴求和
fmt.Println(sumRecursion(100000))
endTime := time.Now()
fmt.Println(endTime.Sub(starTime))
starTime2 := time.Now()
//呼叫for迴圈求和
fmt.Println(SumFor(100000))
endTime2 := time.Now()
fmt.Println(endTime2.Sub(starTime2))
}複製程式碼
輸出結果:
5000050000
14.0271ms
5000050000
0s複製程式碼
1.從結果可以看出,遞迴執行的時間長,沒有for迴圈執行的快;
2.遞迴執行大量運算時也會丟擲棧溢位,因為遞迴時需要不斷向棧中新增變數名:
比如:sumRecursion(10) = 10 + sumRecursion(9);
sumRecursion(9) = 9 + sumRecursion(8);
sumRecursion(8) = 8 + sumRecursion(7)複製程式碼