javascript 用記憶函數(shù)快速計(jì)算遞歸函數(shù)
更新時(shí)間:2010年03月15日 20:01:36 作者:
摘自《JavaScript: The Good Parts》,作為讀書(shū)筆記備用。對(duì)于追求執(zhí)行效率的朋友可以參考下。
如果有一個(gè) fibonacci 數(shù)列要計(jì)算:
var fibonacci = function (n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
};
恐怕數(shù)字一大瀏覽器就會(huì)崩掉了,因?yàn)檫\(yùn)算過(guò)程中函數(shù)會(huì)有大量重復(fù)的計(jì)算。但 JavaScript 強(qiáng)大的數(shù)組和函數(shù)閉包可以輕松實(shí)現(xiàn)對(duì)已計(jì)算的結(jié)果記憶。運(yùn)算速度會(huì)有指數(shù)級(jí)的提高。
小而強(qiáng)大的記憶函數(shù):
var memoizer = function (memo, fundamental) {
var shell = function (n) {
var result = memo[n];
if (typeof result !== 'number') {
result = fundamental(shell, n);
memo[n] = result;
}
return result;
};
return shell;
};
第一個(gè)參數(shù)為初始記憶數(shù)列,第二個(gè)參數(shù)為基礎(chǔ)函數(shù)。用起來(lái)就更簡(jiǎn)單啦:
var fibonacci = memoizer([0, 1], function (shell, n) {
return shell(n - 1) + shell(n - 2);
});
類(lèi)似的,如果要算 factorial 數(shù)列:
var factorial = memoizer([1, 1], function (shell, n) {
return n * shell(n - 1);
});
復(fù)制代碼 代碼如下:
var fibonacci = function (n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
};
恐怕數(shù)字一大瀏覽器就會(huì)崩掉了,因?yàn)檫\(yùn)算過(guò)程中函數(shù)會(huì)有大量重復(fù)的計(jì)算。但 JavaScript 強(qiáng)大的數(shù)組和函數(shù)閉包可以輕松實(shí)現(xiàn)對(duì)已計(jì)算的結(jié)果記憶。運(yùn)算速度會(huì)有指數(shù)級(jí)的提高。
小而強(qiáng)大的記憶函數(shù):
復(fù)制代碼 代碼如下:
var memoizer = function (memo, fundamental) {
var shell = function (n) {
var result = memo[n];
if (typeof result !== 'number') {
result = fundamental(shell, n);
memo[n] = result;
}
return result;
};
return shell;
};
第一個(gè)參數(shù)為初始記憶數(shù)列,第二個(gè)參數(shù)為基礎(chǔ)函數(shù)。用起來(lái)就更簡(jiǎn)單啦:
復(fù)制代碼 代碼如下:
var fibonacci = memoizer([0, 1], function (shell, n) {
return shell(n - 1) + shell(n - 2);
});
類(lèi)似的,如果要算 factorial 數(shù)列:
復(fù)制代碼 代碼如下:
var factorial = memoizer([1, 1], function (shell, n) {
return n * shell(n - 1);
});
您可能感興趣的文章:
- JavaScript遞歸函數(shù)定義與用法實(shí)例分析
- PHP自定義遞歸函數(shù)實(shí)現(xiàn)數(shù)組轉(zhuǎn)JSON功能【支持GBK編碼】
- JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析
- 基于JS遞歸函數(shù)細(xì)化認(rèn)識(shí)及實(shí)用實(shí)例(推薦)
- JavaScript正則表達(dá)式校驗(yàn)與遞歸函數(shù)實(shí)際應(yīng)用實(shí)例解析
- JS中遞歸函數(shù)
- javascript中遞歸函數(shù)用法注意點(diǎn)
- javascript實(shí)現(xiàn)網(wǎng)頁(yè)子頁(yè)面遍歷回調(diào)的方法(涉及 window.frames、遞歸函數(shù)、函數(shù)上下文)
- js中遞歸函數(shù)的使用介紹
- javascript遞歸函數(shù)定義和用法示例分析
相關(guān)文章
JS/jQuery判斷DOM節(jié)點(diǎn)是否存在的簡(jiǎn)單方法
下面性?xún)r(jià)比就為大家?guī)?lái)一篇JS/jQuery判斷DOM節(jié)點(diǎn)是否存在的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起 小編過(guò)來(lái)看看吧2016-11-11js網(wǎng)頁(yè)側(cè)邊隨頁(yè)面滾動(dòng)廣告效果實(shí)現(xiàn)
其實(shí)這個(gè)效果不是什么難實(shí)現(xiàn)的效果,關(guān)鍵注意幾個(gè)地方就可以了2011-04-04JavaScript在IE和Firefox上的差異及相互替代的實(shí)現(xiàn)方法
我們經(jīng)常在處理ie和firefox下的js總會(huì)碰到一些兼容問(wèn)題,下面是些總結(jié),希望大家仔細(xì)看看研究2008-06-06JavaScript+html5 canvas制作的圓中圓效果實(shí)例
這篇文章主要介紹了JavaScript+html5 canvas制作的圓中圓效果,結(jié)合完整實(shí)例形式分析了基于JavaScript與html5 canvas技術(shù)實(shí)現(xiàn)的圖形繪制與顏色隨機(jī)填充技巧,需要的朋友可以參考下2016-01-01微信小程序使用自定義組件導(dǎo)航實(shí)現(xiàn)當(dāng)前頁(yè)面高亮
這篇文章主要介紹了微信小程序使用自定義組件導(dǎo)航實(shí)現(xiàn)當(dāng)前頁(yè)面高亮,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01分享經(jīng)典的JavaScript開(kāi)發(fā)技巧
這篇文章向大家分享了40多個(gè)經(jīng)典的JavaScript開(kāi)發(fā)技巧,相信讀完這篇文章對(duì)大家開(kāi)發(fā)javascript有很大的幫助作用,感興趣的小伙伴們可以參考一下2015-11-11layui-laydate時(shí)間日歷控件使用方法詳解
這篇文章主要為大家詳細(xì)介紹了layui-laydate時(shí)間日歷控件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11