首页 > 其他分享 >练习9:尾递归优化

练习9:尾递归优化

时间:2022-08-19 16:04:31浏览次数:60  
标签:调用 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)

标签:调用,return,递归,练习,ECStack,上下文,total,优化
From: https://www.cnblogs.com/xuweikang/p/16602254.html

相关文章

  • 练习10:打乱一个数组
    这种解法有问题!![12,4,16,3].sort(function(){return5-Math.random();});v8在处理sort方法时,使用了插入排序和快排两种方案。当目标数组长度小于10时,使用......
  • 练习2:Object.prototype.toString()
    对于Object.prototype.toString()方法,会返回一个形如"[objectXXX]"的字符串。如果对象的toString方法没有被重写,就会返回如上面形式的字符串。({}).toString();......
  • 练习3:深浅拷贝实现
    Object.assign原理及其实现MDN:主要是将所有可枚举属性的值从一个或多个源对象复制到目标对象,同时返回目标对象。//第一步leta={name:"advanced",ag......
  • 练习6:节流和防抖实现
    节流函数节流指的是某个函数在一定时间间隔内(例如3秒)只执行一次,在这3秒内无视后来产生的函数调用请求,也不会延长时间间隔。3秒间隔结束后第一次遇到新的函数调用会......
  • 练习5:常见Array原型方法实现
    Array.prototype.mapArray.prototype.map2=function(callbackfn,thisArg){if(this==null){thrownewTypeError('Cannotreadproperty"map"ofnullor......
  • 练习7:函数记忆相关
    何为函数记忆函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。常用于,复杂且有重复的计算。例如:斐波那契数列的计算under......
  • 练习8:最大公约数和最小公倍数问题
    最大公约数的计算,用到辗转相除法例如:求gcd(24,10),可以转换为gcd(10,4),然后是gcd(4,2),然后是(2,0),最好得出结果是2方法1:functiongcd(a,b){vartempif......
  • 第四章 2 数据类型-字符串 练习题
    第四章2数据类型-字符串练习题基础知识1\python语句"".join(list('hellowordld!'))的执行结果是:helloworld!#join()函数,是字符串内置的一个函数,在classstr下面a......
  • 凸优化|凸函数
    一、定义和基本性质1.1定义一个函数\(f:\mathbf{R}^n\rightarrow\mathbf{R}\)是凸函数当且仅当\(\mathrm{dom}\;f\)是凸集,且对于所有的\(x,y\in\mathrm{dom}\;f\)......
  • 凸优化|凸集
    1.直线和线段假设\(x_1\nex_2\)是\(\mathbf{R}^n\)空间(n维欧氏空间)中的两个点,直线\[y=\thetax_1+(1-\theta)x_2\]是穿过\(x_1\)和\(x_2\)的直线,\(\theta\i......