aardio 文档

尾调用优化

请看下面的例子:

function tailCaller (x){ 
     return tailCallee(x) //调用另外一个函数以后不再做任何事称为尾调用
}

如果一个函数(tailCaller)在调用另外一个函数(tailCallee)以后不再做任何事称为尾调用。被调用函数(tailCallee)结束后不再需要返回原来的函数(tailCaller),所以不需要额外的栈保留调用函数(tailCaller)的数据。

正确的尾调用:

递归调用函数是很浪费资源的,但是如果使用尾调用就不再需要大量的压栈,无论递归多少次都不会导致栈溢出。

下面是一个递归尾调用的示例:

import console;

//递归函数
var function recursion( count ){

    if( count <= 0 ) return count; 
    else {
        // 这是一个的尾调用
        return recursion(  count-1 ); 
    }
}

//调用递归函数 
console.log( recursion( 99999  )  )
console.pause()

如果我们把 return recursion(a-1) 改成 return recursion(a-1)+1 就不再是尾调用了,这会导致内存不断地增加直到栈溢出,然后报错无法继续运行。

Markdown 格式