递归
函数直接或间接调用自身
避免无限递归,无限递归会导致执行栈溢出。
对比死循环
- 死循环不会报错,也不会导致栈溢出
- 无限递归会导致栈溢出
执行栈
任何代码的执行都必须有一个执行环境,执行环境为代码的执行提供支持
执行环境是放到执行栈中的。
每个函数的调用,都需要创建一个函数的执行环境,函数调用结束,执行环境销毁。
执行栈有相对固定的大小,如果执行环境太多,执行栈无法容纳,会报错
尾递归
如果一个函数最后一条语句是调用函数,并且调用函数不是表达式的一部分,则该语句称为尾调用,如果尾调用是调用自身函数,则称为尾递归。
某些语言或执行环境会对尾调用进行优化,它们会理解销毁当前函数,避免执行栈空间被占用。
在浏览器执行环境中,尾调用没有优化。但在nodejs环境中有优化。