程序員面試系列程序員
Java面試系列-webapp文件夾和WebContent文件夾的區別?web
程序員面試系列:Spring MVC能響應HTTP請求的緣由?面試
Java程序員面試系列-什麼是Java Marker Interface(標記接口)數據庫
使用JDK自帶的工具jstack找出形成運行程序死鎖的緣由編程
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接受一個函數。