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

程序員面試系列程序員

Java面試系列-webapp文件夾和WebContent文件夾的區別?web

程序員面試系列:Spring MVC能響應HTTP請求的緣由?面試

Java程序員面試系列-什麼是Java Marker Interface(標記接口)數據庫

使用JDK自帶的工具jstack找出形成運行程序死鎖的緣由編程

編程面試題:編寫一個會形成數據庫死鎖的應用json

JavaScript面試系列:JavaScript設計模式之橋接模式和懶加載設計模式

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

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

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

我寫的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爲2

console.log(generator.current);

// 一旦執行next函數,則執行其指向的return fib(b, _current); 1 + 2 = 3

var result = generator.next();

console.log(result.current); // 打印3

若是要打印10個非波拉契數列的值,意味着我要重複調用9次fib函數,太麻煩。因而我寫了個函數把fib調用包裹起來。

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

相關文章
相關標籤/搜索