算法图解--学习笔记(递归)

100 阅读1分钟

关键词

  • 递归
  • 基线条件
  • 递归条件

循环与递归

Leigh Caldwell在Stack Overflow上说的一句话:如果使用循环,程序的性能可能更高;如果使用递归,程序可能 更容易理解。如何选择要看什么对你来说更重要。

为什么循环会比递归性能更高?这个就涉及到计算机底层设计逻辑,因为函数每次调用都需要创建栈,压栈,出栈,而循环就省略了这个过程,所以性能更高。

每一个递归函数都包括两个条件:递归条件 与 基线条件。递归条件是函数调用自己,而基线条件是函数不再调用自己,这样就能避免死循环。

练习

func factorial(x int) (res int) {
    // 基线条件 x == 1
    if x == 1 {
        return 1;
    }
    // 递归条件 x > 1
    return x * factorial(x - 1)
}

func main() {
    results 	:= factorial(5)
    fmt.Println("results", results)
}

// 输出
$  go run main.go
results 120

小结

  • 递归函数就是调用函数自己,每一个递归函数都有递归条件与基线条件。
  • 每个函数都有一个调用栈,如果调用栈很长,可能会比较占用内存。