首页 > 技术文章 > 尾调用与尾递归

doit8791 原文

一、尾调用

尾调用是指函数的返回值为纯函数调用的情况,即函数最终的返回值与它返回的调用函数的返回值完全一致,这也要求函数最后一句话是返回调用某个函数值,且该函数调用不出现在表达式中。

现代编译器一般都支持尾调用优化,编译器执行到最后一条语句再调用函数时不用保存当前函数的栈信息,加快程序的执行效率。

二、尾递归

尾调用函数最后调用的是它自身,特殊的尾调用。对编译器优化很敏感,列子如下:

//普通线性递归写法
function
fib(n){ if(n<=2){ return 1; } return fib(n-1)+fib(n-2); } console.log(fib(3)) console.log(fib(50))
//尾递归的写法,此时当递归层级深时执行速度比上面的快很多
function fibtail(n,acc1,acc2){ if(n<2){ return acc1; } //console.log(); return fibtail(n-1,acc2,acc1+acc2); } console.log(fibtail(3,1,1)) console.log(fibtail(50,1,1))

推荐阅读