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

面試攢經驗,let's go!

值此高考來臨之際,閒不住的我又雙叒叕出發去面試攢經驗了,去了公司交待一番流程後,面試官甩給了我一張A4紙,上面寫着一道js算法筆試題(一開始我並不知道這是在考察js算法),上面寫着「一、一、二、三、五、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;

}

面試題的最優解

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

前端的工做,「最優解」實際上是一種自我追求進步的表現。code

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

先來看看迭代的解法圖片

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了,可是我認爲工程師都應該學習算法,我以爲那不只僅是對軟件工程思想的培養,更是一種對心智的鍛鍊。

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

圖片描述

相關文章
相關標籤/搜索