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

首頁 > 開發 > JS > 正文

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

2024-05-06 16:47:47
字體:
來源:轉載
供稿:網友

本文實例講述了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/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 钦州市| 资兴市| 宽城| 泰安市| 永宁县| 东城区| 望城县| 湄潭县| 谢通门县| 竹溪县| 托克托县| 即墨市| 汝州市| 嘉义市| 包头市| 南部县| 烟台市| 平湖市| 托克逊县| 葫芦岛市| 双辽市| 霍林郭勒市| 临潭县| 黔南| 靖州| 临沧市| 原阳县| SHOW| 凤翔县| 广水市| 黑山县| 九龙坡区| 涟水县| 同德县| 同江市| 长海县| 玉树县| 淄博市| 桦川县| 榕江县| 万源市|