浅谈尾调用和尾递归
本文主要讲述尾调用、尾递归的定义以及在实际中遇到的场景,仅为个人浅薄见解。
尾调用,指一个函数在结束操作即最后一步去调用另一个函数。
尾递归,实际上就是尾调用,区别就在于递归二字,总所周知,函数的递归即自己调用本身。因此尾递归就是函数在执行到最后一步的操作调用本身。
下面我们就通过具体的例子来加深一下印象:
function f(x){ return g(x);}
function g(x){ console.log(‘我被调用了!’); }
上面的例子中f(x)在最后一步调用了另一个函数g(x),这就是典型的尾调用。而尾递归的范例就是f(x)在最后一步的操作调用自身,如下:
function f(x){ return f(x);}
那下面这种情况呢?它属于尾调用么???
function f(x){ return g(x)+1;}
function g(x){ return x+2; }
实际上上述的情况就不再符合尾调用的定义了。为什么呢?我们来细细拆分一下。
f(x)在最后一步调用了g(x),但是在执行完g(x)函数后下一步又返回了f(x)中又执行加1的操作。也就是说上述的函数在最后操作的是加1的操作,而不是调用一个函数的步骤。因此上述案例不是尾调用。同理,尾递归也一样。