文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Javascript尾递归编程怎么实现

2023-07-02 11:20

关注

本篇内容介绍了“Javascript尾递归编程怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

尾递归编程思想

递归是编程中必不可少的一环,在算法和工程上会经常使用,但是随着计算量的增大,函数堆栈会大量堆积上一函数上下文中的变量和方法,会导致主线程栈的空间不足而造成栈溢出错误,由于新的函数压入堆栈后,上一函数仍然在堆栈中未被释放,因此内存资源消耗会十分大,对性能也会有很大影响。

我们知道递归写起来确实方便,逻辑也容易理解,最简单的斐波那契数列问题,跳楼梯,一次只能1步或2步,跳n格有多少种方法

最容易的递归

// 限制条件 countOfStep>0function jump(countOfStep) {    if (countOfStep <= 0) return 0;    function jumpRecursive(innerCountOfStep) {        if (innerCountOfStep < 0) return 0;        if (innerCountOfStep === 1 || innerCountOfStep === 0) return 1;        return jumpRecursive(innerCountOfStep - 1) + jumpRecursive(innerCountOfStep - 2);    }    return jumpRecursive(countOfStep);}

很明显上述递归没有任何优化,利用函数堆栈来实现对上一结果的保存作为下一结果的支撑,函数开销大。

运用缓存结果思想解决函数开销

function jumpWithoutFuncCost(countOfStep) {    if(countOfStep<=0) return 0;    const saves = new Array(countOfStep + 1).fill(0);    [saves[0], saves[1]] = [1, 1];    for (let i = 2; i <= countOfStep; i++) {        saves[i] = saves[i - 1] + saves[i - 2];    }    return saves[countOfStep];}

是解决了数据过大栈溢出问题了,不过也同时带来空间开销

迭代方法

function jumpIteritive(countOfStep) {    if(countOfStep<=0) return 0;    let [prefix, suffix] = [1, 1];    for (let i = 2; i <= countOfStep; i++) {        let temp = suffix;        suffix += prefix;        prefix = temp;    }    return suffix;}

如果是复杂点的问题迭代法是比较难想出来的。但凡可以实现迭代处理的方法可以用尾递归实现,递归的实现更具有可读性和简洁性。

尾递归实现

function jumpTailRecursive(countOfStep, prev = 1, next = 1) {    if(countOfStep<=0) return 0;    if (countOfStep === 1) return next;    return jumpTailRecursive(--countOfStep, next, prev + next);}

原理图解

Javascript尾递归编程怎么实现

关于Javascript没有实现尾递归优化

Javascript由于某些原因,JavaScript引擎实现者认为特性不合理,以及各大厂商的权力纠纷问题,TC39提案仍未落实尾递归优化方案。

如果要实现JavaScript尾递归优化,需要采用蹦床函数辅助实现,才能实现和迭代一样避免栈溢出情况。

trampoline实现

function jumpTailRecursiveTrampolined(countOfStep, prev = 1, next = 1) {    if (countOfStep <= 0) return 0;    if (countOfStep === 1) return next;    return () => jumpTailRecursiveTrampolined(--countOfStep, next, prev + next);}function trampoline(F){    return function(...args){        F = F.bind(this, ...args);        while (F instanceof Function) {            F = F();        }        return F;    }}const uniformLog = (element) => console.log(JSON.stringify(element, undefined, 4));uniformLog(trampoline(jumpTailRecursiveTrampolined)(3));

“Javascript尾递归编程怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯