日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)

發布時間:2023/12/19 javascript 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

面試題:用JavaScript開發一個函數,打印非波拉契數列。

我們只要記住非波拉契數列的計算公式,就不難寫出來了:

F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)

我寫的JavaScript代碼如下:

var fib = function (a, b) {var _current = a + b;return {current: _current,next: function () {return fib(b, _current);}} }

把當前這一輪的計算結果存儲到第二行的變量_current里,并通過屬性current返回給調用者。返回的json對象除了current屬性外,還有另一個屬性next,指向一個閉包函數調用。一旦next指向的函數再次被調用,則會再次觸發數列的計算。

var generator = fib(1,1);// 前一行調用fib(1,1)計算1+1的結果為2,將2存儲到_current里通過current屬性返回,所以打印2// 同時返回next函數,函數體為return fib(b, _current); 此時b為1,_current為2console.log(generator.current);// 一旦執行next函數,則執行其指向的return fib(b, _current); 1 + 2 = 3var result = generator.next();console.log(result.current); // 打印3

如果要打印10個非波拉契數列的值,意味著我要重復調用9次fib函數,太麻煩。于是我寫了個函數把fib調用包裹起來。

這個包裹函數有兩個輸入參數,n為希望生成非波拉契數列元素的個數,第二個參數sequence接受一個函數。

var take = function(n, sequence) {var result = [];var temp = sequence;for (var i = 0; i < n; i++) {result.push(temp.current);temp = temp.next();}return result;}

現在我只需要一行語句,就能打印10個非波拉契數列的元素出來。

console.log(take(10, fib(1,1)));

采用ES6的GeneratorFunction生成非波拉契數列

ES6提供了原生GeneratorFunction的支持,語法非常有特色,關鍵字function后面緊跟一個星號。GeneratorFunction的詳細介紹參考官網:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*

先看如何用GeneratorFunction這個黑科技重新實現非波拉契樹立的生成。代碼如下:

var fib_generator = function *(){var current = 0, next = 1;while(true) {[next, current] = [next+current, next];yield current;}}var fib = fib_generator();for(var i = 0; i < 10; i++){console.log(fib.next().value);}

第5行從語義上非常清晰地體現出了非波拉契數列的計算公式:

F(n)=F(n-1)+F(n-2)

然而它是包含在一個while(true)的無限循環內的,所以這段代碼是如何工作的呢?

最好的學習辦法就是單步調試。

代碼第40行到第47行,我們使用了ES6 function*關鍵字得到了一個"function generator"。在這個generator內部,我們定義了一個無限循環,用于計算非波拉契數列。

第49行,我們用()調用了這個generator,將結果存儲在變量fib里。直到此時,function generator的實現體,即代碼41~45行還沒有得到執行。

實際上,49行的變量lib只是維護了一個指向fib_generator的ITERATOR指針。

這個ITERATOR自帶了一個名為next的方法,是ES6的原生實現,大家看上圖調試器里的fib.next顯示的是native code。Functiongenerator的神奇之處在于,當next方法被調用一次,則generator內部的函數體也只會執行一次。

單步執行,執行一次next方法:

注意調用棧,此時我們已經進入fib_generator函數體內部了:

一旦在FunctionGenerator實現體內部執行到yield關鍵字,則當前計算結果作為返回值返回給consumer。也就是說,一旦執行遇到yield,則自動從無限循環中退出。

下列簡單的循環會打印10個非波拉契數列的元素:

for(var i = 0; i < 10; i++){var currentResult = fib.next();console.log(currentResult.value);}

從上面的代碼能看出,yield關鍵字返回一個json對象給消費者,該對象有個名為name的屬性,包含的是具體計算的數值。Json對象的另一個屬性名為done,類型為boolean,意思是這個FunctionGenerator的函數體執行是否已經結束。在我的這個例子里,每次next調用的yield返回的Json對象的done屬性都為false,因為我的FunctionGenerator內部是一個無限循環。

采用ES6的FunctionGenerator打印出的結果和常規寫法一致。

相信您面試的時候,如果能用ES6的FunctionGenerator完成這道題目,一定能讓面試官對您刮目相看。

要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙"或者掃描下面二維碼:

總結

以上是生活随笔為你收集整理的使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。