iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Javascript尾递归编程怎么实现
  • 474
分享到

Javascript尾递归编程怎么实现

2023-07-02 11:07:33 474人浏览 独家记忆
摘要

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

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

--结束END--

本文标题: Javascript尾递归编程怎么实现

本文链接: https://www.lsjlt.com/news/341465.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javascript尾递归编程怎么实现
    本篇内容介绍了“Javascript尾递归编程怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!尾递归编程思想递归是编程中必不可少的一环...
    99+
    2023-07-02
  • Javascript尾递归编程的实现
    目录尾递归编程思想最容易的递归运用缓存结果思想解决函数开销迭代方法尾递归实现原理图解关于Javascript没有实现尾递归优化trampoline实现尾递归编程思想 递归是编程中必不...
    99+
    2024-04-02
  • python怎么实现尾递归优化
    小编给大家分享一下python怎么实现尾递归优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明尾递归是指在函数返回时调用自身,return语句不能包含表达式。...
    99+
    2023-06-20
  • JavaScript尾递归的实现及应用场景
    目录什么是尾递归和递归的差别尾递归的优化应用场景总结什么是尾递归 尾递归是一种特殊的递归,它的特点是在函数的最后一步调用自身,而不是在调用后还有其他操作。尾递归可以有效地避免栈溢出的...
    99+
    2023-05-18
    Javascript尾递归
  • Java8使用lambda实现Java的尾递归
    前言本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用。众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类的循环通通可以用递归来实现,这类语言的编译...
    99+
    2023-05-30
    java8 lambda 尾递归
  • C++ 递归函数的尾递归优化策略如何实现?
    尾递归优化策略通过将尾递归调用转换为循环,有效减少函数调用栈深度,防止栈溢出。优化策略包括:检测尾递归:检查函数中是否存在尾递归调用。将函数转换为循环:使用循环来代替尾递归调用,并维护栈...
    99+
    2024-04-17
    递归函数 尾递归优化 c++
  • C++ 函数的递归实现:尾递归在实际应用中的示例?
    c++++中的尾递归优化:尾递归是一种函数在调用自身后立即返回的优化技术。通过指定noinline关键字,可在c++中实现尾递归,提高性能。实战案例:使用尾递归计算阶乘,该阶乘定义为从1...
    99+
    2024-04-22
    c++ 递归
  • JavaScript如何实现递归
    这篇文章主要介绍JavaScript如何实现递归,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是递归?如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是...
    99+
    2023-06-21
  • Javascript中怎么递归实现结构树
    Javascript中怎么递归实现结构树,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 数组求和对于已知数组arr,求arr各项之和。...
    99+
    2024-04-02
  • 详解Python如何实现尾递归优化
    目录一般递归与尾递归一般递归尾递归C中尾递归的优化Python开启尾递归优化一般递归与尾递归 一般递归 def normal_recursion(n): if n == 1:...
    99+
    2024-04-02
  • Python怎么开启尾递归优化
    这篇文章主要讲解了“Python怎么开启尾递归优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么开启尾递归优化”吧!一般递归与尾递归一般递归:def normal_...
    99+
    2023-06-30
  • C++ 函数的递归实现:如何使用尾递归优化技术?
    递归函数的效率问题可以通过尾递归优化 (tc++o) 技术解决。c++ 编译器虽然不支持 tco,但可以通过 [__tail_recursive](https://en.cpprefer...
    99+
    2024-04-22
    c++ 递归
  • Python开启尾递归优化的实现示例
    目录一般递归与尾递归一般递归:尾递归C中尾递归的优化Python开启尾递归优化一般递归与尾递归 一般递归: def normal_recursion(n): if n == ...
    99+
    2024-04-02
  • python怎么实现递归
    这篇文章将为大家详细讲解有关python怎么实现递归,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最简单的递归的实例  # -*- coding:ut...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归在编程竞赛中的应用?
    递归是一种函数调用自身解决问题的技术,包含基线条件以终止递归。在 c++++ 中,可使用关键字 return 返回函数值并终止递归。递归可用于解决经典问题,如汉诺塔问题,其中它将 n 个...
    99+
    2024-04-22
    c++ 递归
  • JavaScript怎么使用递归
    这篇文章将为大家详细讲解有关JavaScript怎么使用递归,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,适合初学前端...
    99+
    2023-06-14
  • 如何在JavaScript, Scala和ABAP里实现尾递
    在JavaScript, Scala和ABAP里实现尾递归(Tail Recursion),针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。B...
    99+
    2024-04-02
  • Java中怎么实现多线程递归
    这篇文章将为大家详细讲解有关Java中怎么实现多线程递归,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。public<T> voidParallelRecursive(f...
    99+
    2023-06-17
  • javascript递归怎么使用
    本篇内容主要讲解“javascript递归怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript递归怎么使用”吧!一、什么是递归?递归是指在一个过程中调用自身的行为。简单来说...
    99+
    2023-07-06
  • c语言递归和非递归排序怎么实现
    本篇内容主要讲解“c语言递归和非递归排序怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言递归和非递归排序怎么实现”吧!递归代码流程归并就是把两个或多个序列合并,这里只介绍二路归并,就...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作