标签:function 调用 return 递归 练习 ECStack 上下文 total 优化
尾递归和普通递归有啥区别
尾调用,是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数。
举个例子:
// 尾调用
function f(x){
return g(x);
}
// 非尾调用
function f(x){
return g(x) + 1;
}
模拟下上述执行上下文栈:
尾调用:
ECStack.push(<f> functionContext)
ECStack.pop()
ECStack.push(<g> functionContext)
ECStack.pop()
非尾调用:
ECStack.push(<f> functionContext)
ECStack.push(<g> functionContext)
ECStack.pop()
ECStack.pop()
也就说尾调用函数执行时,虽然也调用了一个函数,但是因为原来的的函数执行完毕,执行上下文会被弹出,执行上下文栈中相当于只多压入了一个执行上下文。然而非尾调用函数,就会创建多个执行上下文压入执行上下文栈。
函数调用自身,称为递归。如果尾调用自身,就称为尾递归。
尾递归优化例子
阶乘优化:
function factirial(n, total = 1) {
if (n < 2) return total
return factirial(n - 1, n * total)
}
factorial(5,1) // 5 * 4 * 3 * 2 * 1 = 120
累加求和:
function sum(n, total = 0) {
if (n < 1) return total
return sum(n-1, n + total)
}
sum(5,1) // 5 + 4 + 3 + 2 + 1 = 15
斐波那契:
function fib(n, sum1 = 1, sum2 = 2) {
if (n < 2) return sum2
return fib(n-1, sum2, sum1 + sum2)
}
fib(100)
标签:function,调用,return,递归,练习,ECStack,上下文,total,优化 来源: https://www.cnblogs.com/xuweikang/p/16602254.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。