太原面經分享:如何用js實現返回斐波那契數列的第n個值的函式

閏土大叔發表於2018-06-07

面試攢經驗,let's go!

值此高考來臨之際,閒不住的我又雙叒叕出發去面試攢經驗了,去了公司交待一番流程後,面試官甩給了我一張A4紙,上面寫著一道js演算法筆試題(一開始我並不知道這是在考察js演算法),上面寫著“1、1、2、3、5、8......,求第n個數的值

不得不承認,當時我第一眼看這道題大腦裡是懵逼的。後來才想起來,這不就是數學題裡的那個斐波那契(肥婆納妾)數列麼!從第三個數開始,每個數都是前兩個數的和。

能get到這個點,你已經成功了一半了。另一半就是需要你將數學公式邏輯轉變成js程式邏輯。

那其實這個問題還可以換個問法:實現一個函式,輸入一個數字n能返回斐波那契數列的第n個值。

分析思路

首先,思路很重要,讓我們一起來分析一下,大概的思路是這樣的:

首先我們要把特殊的部分給獨立出來做個判斷,哪些數字是特殊的呢?很明顯是斐波那契數列的前兩項,而斐波那契數列的前兩項都為1。然後定義三個變數,firstNum、secondNum、total,分別代表著第一個數字,第二個數字,還有他們倆之和。

然後通過一個for迴圈遍歷,將firstNum加上secondNum的結果賦值給total,然後將secondNum的value賦值給firstNum,把total的value賦值給secondNum,以此根據傳入的n來不斷地迴圈疊加,達到想要的total值,最後return返回出去。

思路說完後,讓我們用js把它實現出來:

// 可能是最普通的解法

var series = function (n) {

  var sum = [0, 1];

  if(n < 2) {

    return sum[n];

  }



  var firstNum = 0;

  var secondNum = 1;

  var total = 0;



  for (var i = 2; i<= n; i++) {

    total = firstNum + secondNum;

    firstNum = secondNum;

    secondNum = total;

  }

  return total;

}
複製程式碼

面試題的最優解

記住,面試官與我們們應聘者的思維不同,你應聘的時候你大部分時間是在想,這道題我會不會做,能不能做出來,而他們想的是這道題的最優解。

前端的工作,“最優解”其實是一種自我追求進步的表現。

除了以上這種辦法,還有什麼更好的解決辦法嗎?答案是有的。

先來看看迭代的解法

var series = function (n) {

  var feipo = [0,1];

  for(var i=2;i<=n;i++){

    feipo[i] = feipo[i-1] + feipo[i-2]

  }

  return feipo[n];

}

// console.log(series(6));
複製程式碼

再來看看遞迴的解法

var series = function (n) {

  if(n >= 2) {

    return series(n-1) + series(n-2)

  }else {

    return n;

  }

}

// console.log(series(6));
複製程式碼

究竟哪個才是最優解,相信看完文章的你們已經有了答案。

可能你們會問:

那閏土你在筆試時做出來了麼?

你猜~

寫在後面

目前為止我也參加過很多次大大小小的前端面試,確實也聽說過有不少面試官會問到一些演算法。通常會涉及的,是連結串列、樹、字串、陣列相關的知識。前端面試對演算法要求不高,似乎已經是業內的一種共識了。雖說演算法好的前端面試肯定會加分,但是僅憑常見的面試題,而不去聯絡需求,很難讓人覺得,演算法對於前端真的很重要。

直到有這麼一天,太原這家公司的前端leader給我出了這麼一道js演算法題之後,還跟我聊了很多內容,與我固有的思維產生了強烈的碰撞。面試官還跟我講,他們公司的技術總監是微軟出身,很注重演算法這塊,他當初應聘進來的時候,也是考察的演算法。

雖然這次面試被pass了,但是我認為工程師都應該學習演算法,我覺得那不僅僅是對軟體工程思想的培養,更是一種對心智的鍛鍊。

文章預告:更多的前端面試分享我都會第一時間更新在我的公眾號<閏土大叔>裡面,歡迎關注!

太原面經分享:如何用js實現返回斐波那契數列的第n個值的函式

相關文章