消除尾递归

尾递归

函数调用自身,称为递归。如果尾调用自身,就称为尾递归。

递归非常耗费内存,因为需要同时保存成千上百个调用帧,很容易发生“栈溢出”错误(stack overflow)。但对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。

对比

package main

import (
    "fmt"
)

// 存在尾递归
func fibonacci(n int) int {
    if n <= 1 {
        return 1
    }else {
        return fibonacci(n - 1) + fibonacci(n - 2)
    }
}


// 消除尾递归
func fibonacci2(n int, args [2]int) int {
    if n <= 1 {
        return args[1]
    }else {
        args[0], args[1] = args[1], args[0] + args[1]
        return fibonacci2(n-1, args)
    }
}


func main() {
    // 计算时间过长
    //fmt.Println(fibonacci(1000))

    // 很快算出来
    args := [2]int{1, 1,}
    fmt.Println(fibonacci2(1000, args)) 
}

你可能感兴趣的:(算法设计,golang)