国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JS尾遞歸的實現方法及代碼優化技巧

2024-05-06 15:43:06
字體:
來源:轉載
供稿:網友

本文實例講述了JS尾遞歸的實現方法及代碼優化技巧。分享給大家供大家參考,具體如下:

在學習數據結構和算法的時候,我們都知道所有的遞歸都是可以優化成棧+循環的。

對于特定的遞歸函數,一般我們都是手動對它們進行優化的。

在學習scala的時候,接觸到尾遞歸的概念。我們只要將遞歸寫成尾遞歸方式,編譯器會自動幫助我們優化。

ps:并不是所有的遞歸都可以改寫成尾遞歸

在js中,尾遞歸通常會被解釋器優化。然而,并不是所有的js解釋器都支持尾遞歸優化。

對于不支持尾遞歸優化的環境,我們需要手動將遞歸優化成棧+循環。

這里實現了一個通用的方法,將尾遞歸優化成棧+循環。

代碼摘自阮一峰的《ECMAScript入門》這本書。

具體代碼如下

function tco(f) {  var value;  var active = false;  var accumulated = [];  return function accumulator() {    accumulated.push(arguments);    if(!active) {      active = true;      while(accumulated.length) {        value = f.apply(this, accumulated.shift());      }      active = false;      return value;    }  };}var sum = tco(function(x, y) {  if(y > 0) {    return sum(x + 1, y - 1);  } else {    return x;  }});let res = sum(1, 5)console.info(res);

這段代碼非常精妙!

分析

已知,任何遞歸可以寫成循環+棧。

實現將任何尾遞歸轉換成循環+棧執行而不需要針對每個尾遞歸函數寫一個實現版本的思路。

困難在于,任何尾遞歸,通用實現。而不是針對某一個遞歸函數。

要點:

棧中保存的數據,正是遞歸函數的參數。

通用實現,那就必須依賴原來的遞歸函數,循環的終止條件,正是遞歸的結束條件。

要將遞歸函數的參數入棧,而不修改原來的遞歸函數,就必須用一個函數代替遞歸函數被調用,從而取得函數入參。

遞歸函數的終止條件,每一個遞歸函數都不一樣,但是如果遞歸函數沒有被再次調用,說明已達到終止條件。即終止條件和遞歸函數的調用有關聯。而遞歸函數每次調用,都會將參數入棧。所以可以根據棧中是否有元素,推斷是否達到終止條件。

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《JavaScript數據結構與算法技巧總結》、《JavaScript數學運算用法總結》、《JavaScript排序算法總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript查找算法技巧總結》及《JavaScript錯誤與調試技巧總結》

希望本文所述對大家JavaScript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 古交市| 东源县| 霍林郭勒市| 南部县| 新津县| 濉溪县| 教育| 明光市| 呼图壁县| 竹山县| 孟州市| 平舆县| 开封市| 龙州县| 肥东县| 潞西市| 延长县| 瓮安县| 云梦县| 洛川县| 潼关县| 呼图壁县| 大城县| 湛江市| 绥滨县| 天门市| 德阳市| 郎溪县| 镇赉县| 宁河县| 余姚市| 滨海县| 馆陶县| 新野县| 双城市| 新密市| 泉州市| 嘉兴市| 徐水县| 夏河县| 台东市|