国产探花免费观看_亚洲丰满少妇自慰呻吟_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程序設計有所幫助。

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

圖片精選

主站蜘蛛池模板: 红安县| 万全县| 仲巴县| 乌拉特后旗| 宣汉县| 榆树市| 旺苍县| 嘉黎县| 交口县| 垣曲县| 确山县| 福清市| 神农架林区| 石城县| 布尔津县| 玛沁县| 滕州市| 扎囊县| 尉犁县| 崇礼县| 望城县| 洪湖市| 潼关县| 旬邑县| 万山特区| 凉城县| 阿鲁科尔沁旗| 浦江县| 吴江市| 瓦房店市| 盐边县| 崇州市| 晋中市| 额济纳旗| 陇西县| 同江市| 武宁县| 瑞丽市| 营山县| 江永县| 丰镇市|