久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JavaScript中的惰性數(shù)組介紹

瀏覽:3日期:2023-11-13 10:06:52

今天我要介紹的是 lazy-arr ,它給JavaScript中帶來(lái)了惰性數(shù)組。

什么是惰性數(shù)組,它為什么有用?

我們來(lái)重現(xiàn)一下你第一次面試軟件工程師時(shí)的題目:寫一個(gè)斐波納契函數(shù)。我們明確了0和1的基本情況,然后遞歸生成剩下的:

let fib = n => { switch (n) { case 0: return 0 case 1: return 1 default: return fib(n - 1) + fib(n - 2) }}

小菜一碟。

這種解決方案有什么問(wèn)題嗎?還用說(shuō)么 - 效率真的真的很低。要計(jì)算第n個(gè)斐波那契數(shù)字,我們要調(diào)用 fib 函數(shù) 2的n-1冪次!簡(jiǎn)直糟糕的要命,我們應(yīng)該做的更好一點(diǎn)。

一種方法是記錄 fib 的輸出。就是說(shuō),由于 fib 是純粹和冪等的,我們可以緩存其輸出:

let memoize = fn => { let cache = new Map return _ => { if (!cache.has(_)) { cache.set(_, fn(_)) } return cache.get(_) }}let fib = memoize(n => { switch (n) { case 0: return 0 case 1: return 1 default: return fib(n - 1) + fib(n - 2) }})

好多了!現(xiàn)在我們輸入為n時(shí),只需調(diào)用 fib n - 1次。

我們還能怎么表達(dá)這種思想呢?

懶序列

在Scale中,你可以這樣做(這得歸功于 Philipp Gabler ):

def fib(n: Int): Stream[Int] = { lazy val stream: Stream[Int] = 0 #:: stream.scan(1)(_ + _) stream.take(n)}

上面做的事情就是定義一個(gè)惰性的數(shù)據(jù)流(兩個(gè)初始數(shù)字,加上一個(gè)能產(chǎn)生更多數(shù)字的函數(shù)),當(dāng)調(diào)用 fib(n) 時(shí),它返回第n個(gè)數(shù)字,或者如果還沒(méi)有計(jì)算,就生成并返回它。另一種思考方式是用生成器和一個(gè)記錄先前產(chǎn)生值的緩存,這樣之后就可以通過(guò)值的索引進(jìn)行訪問(wèn)。

惰性流是一個(gè)非常酷的抽象概念,對(duì)于計(jì)算開(kāi)銷昂貴的序列,或者是不可能計(jì)算所有索引的序列都有效(即:無(wú)限序列)。這在功能性語(yǔ)言中很受歡迎,特別是默認(rèn)具有惰性求值的語(yǔ)言。比如在Haskell中就是這樣做:

fibs :: [Integer]fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

同樣的思維,但在Clojure就是這樣:

(defn fib [] ((fn rfib [a b](cons a (lazy-seq (rfib b (+ a b))))) 0 1))

你大概明白了吧。

那在JavaScript中怎么用呢?

JavaScript中的惰性序列

通過(guò) lazy-arr ,你可以像這樣:

let fibs = lazy([0, 1])(_ => fibs[_ - 1] + fibs[_ - 2])

就這樣!然后,您可以根據(jù)需要訪問(wèn)數(shù)組中的項(xiàng),并根據(jù)需要進(jìn)行計(jì)算:

fibs[10] // 55fibs[7] // 13

第一行計(jì)算第10個(gè)斐波納契數(shù),并且由于我們遞歸地進(jìn)行計(jì)算的定義(按照以前的斐波那契數(shù)),我們需要計(jì)算前9個(gè)斐波那契數(shù),以此來(lái)計(jì)算第10個(gè)。所以當(dāng)我們?cè)诘诙杏?jì)算第七個(gè)斐波納契數(shù)時(shí),結(jié)果會(huì)立即返回,因?yàn)槲覀円呀?jīng)計(jì)算好了!

最重要的是,就用戶關(guān)心的來(lái)說(shuō), fibs 數(shù)組并不會(huì)做任何懈怠地、有狀態(tài)地或遞歸地或其他類似的事情。它只是一個(gè)數(shù)組。那些麻煩的東西被lazy-arr封裝好了,生成器就是一行代碼。

是不是很優(yōu)雅?

來(lái)自:http://www.zcfy.cc/article/performancejs-introducing-lazy-arrays-in-javascript-3312.html

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 日韩在线观看第一页 | 国产精品一区亚洲二区日本三区 | 国产精品一区免费在线观看 | 一级黄色片a级 | 美女又黄又免费 | 毛片链接 | 电家庭影院午夜 | 午夜视频网站 | 亚洲成人另类 | 亚洲精品久久久久久一区二区 | 国产欧美日韩综合精品一区二区 | 欧美成年人视频 | 精品一区国产 | 成人一区在线观看 | 日韩av不卡在线 | 中文无吗 | 日韩毛片在线观看 | 午夜精品久久久久久久久久久久 | 亚洲电影一区二区 | 99在线视频精品 | 亚洲男人的天堂网站 | 午夜影院a| 欧洲一区在线 | 91精品综合久久久久久五月天 | 中文字幕av网 | 中文字幕日韩欧美一区二区三区 | 亚洲 欧美 日韩在线 | 国产精品乱码一区二区三区 | 久久久av亚洲男天堂 | 成年人性视频 | 色精品视频 | 国产综合欧美 | 久久99精品国产麻豆婷婷洗澡 | 亚洲综合电影 | 国产高清在线精品一区二区三区 | 久精品视频 | 日韩一级大片 | 日韩亚洲一区二区 | 国产精品久久久久久久久久久久久久 | 日本免费视频在线观看 | 亚洲午夜电影 |