JavaScript中的递归即函数内调用函数自身,但递归是非常耗内存的,每一次调用都会分配一定的栈空间,达到一定的数量(具体看浏览器)便会溢出报错。
function recursion (num) { if (num === 1) { return 1; } return num + recursion(--num); } console.log(recursion(5)); // 15 console.log(recursion(1000)); // 500500 console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded
对于尾递归来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”错误。
'use strict'; function recursion (num, total = 0) { if (num === 1) { return total + 1; } return recursion(num - 1, total + num); } console.log(recursion(5)); // 15 console.log(recursion(1000)); // 500500 console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded
实际上还是报错了:D。
-- 2018-08-12 --
目前浏览器还不支持尾递归。