当前位置: 首页 > 网络应用技术

尾声优化

时间:2023-03-05 23:55:28 网络应用技术

  今天,当您刷leetcode时,当您看到问题攀登楼梯时,可以使用递归的调用来解决问题。

  但是,递归解决方案将发生并调用堆栈溢出。您可以考虑优化尾部递归的使用,因此总结波浪。

  尾声是功能编程的重要概念。该概念很简单,即功能的函数的最后一步总是返回另一个函数的调用结果。

  尾部调用是指函数的最后一步,因此功能调用不一定出现在函数末尾。

  尾部调用的核心是指该函数是否执行最后一步。本质是该函数是否调用另一个函数。它本身已发布。我们知道,当调用函数时,内存将形成呼叫记录,即函数调用框架,该函数呼叫框架保留了函数的函数和函数的可变信息。执行函数后,该框架被调用到堆栈中,并且在执行完成后将堆栈出现。尾部呼叫的特殊功能是,其最后一步是调用另一个功能,这意味着不再需要其自己的呼叫记录信息,并且可以用内部函数的呼叫记录替换。这是“尾部调用优化”,仅保留内部层函数的呼叫记录。如果所有功能称为尾部,那么每个功能都只有一个呼叫记录您执行的时间,这将大大节省内存。“尾声调用优化”的含义也在这里。

  递归是指在执行功能时调用自身,递归是指呼叫自身,也就是说,函数的最后一步是本身。递归是概念并讨论的原因是因为我们都知道递归非常非常被内存占据,因此有必要同时保存数十万个呼叫记录,并且特别容易引起“堆栈溢出”错误(堆栈溢出”。,并且不需要先前的呼叫记录来存储堆栈溢出问题并避免大量内存职业。

  例如,使用递归攀爬楼梯的问题。由于需要保留每个步骤的呼叫记录,因此当n更大时溢出非常容易,并且执行时间易于超过限制。

  如果将其重写到最后,则只保留一个呼叫记录,复杂性为O(1)。

  可以看出,“尾声呼叫优化”对于递归操作具有重要意义,因此一些功能性编程语言也将其写入了语言规范中。在它们之际,Ecmascript(6及以上)也清楚地规定了“尾部呼叫优化的实现”“这意味着,只要尾部递归在ecmascript(6及以上)中使用,就不会有堆栈溢出(或递归层的超时),这是相对保存的存储器。但是目前,只有Safari浏览器支持尾声优化,暂时不支持Chrome和Firefox。

  原始:https://juejin.cn/post/7111468385610760199