尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回。我们知道在函数调用时,会在内存中生成一个调用记录,即调用帧(call frame),用于保存调用位置和内部变量等信息。而尾调用由于是函数的最后一步操作,所以可以不在调用栈上添加一个新的调用帧,而是直接更新外层函数的调用帧,这种处理方式即尾调用优化(Tail Call Optimization, TCO)。

尾递归也是一种尾调用,通过TCO,可以使原本 O(n) 的调用栈空间只需要 O(1)

一些语言会针对尾递归做一些优化,但Swift不确保在所有情况下都做了优化。

参考

  1. Does Swift implement tail call optimization? and in mutual recursion case?
  2. Functional Swift: Tail Recursion Explained
  3. 尾调用