2016-06-09 170 views
1

所以我創建了斐波那契數列,但是我在w3資源上找到的方式對我來說有點令人困惑,因爲我是初學者。 n = 2究竟發生了什麼? s變成fibonnacci_series(1),但這甚至意味着什麼?首先,爲什麼我們有var fibonacci_series = function(n),爲什麼不只是有一個函數叫做function fibonacci_series(n)Javascript斐波那契方法

var fibonacci_series = function (n) 
{ 
    if (n===1) 
    { 
    return [0, 1]; 
    } 
    else 
    { 
    var s = fibonacci_series(n - 1); 
    s.push(s[s.length - 1] + s[s.length - 2]); 
    return s; 
    } 
}; 

console.log(fibonacci_series(8)); 

回答

1

n = 2究竟發生了什麼? s變成fibonacci_series(1),但這甚至意味着什麼?

這意味着你會得到相同的結果,就像你自己調用了fibonacci_series(1)一樣。所以s將是[0, 1]。之後,您將這兩個數字的總和加到數組的末尾,結果爲[0, 1, 1]。這種關係(Nm = N(m-1)+ N(m-2))是what defines the Fibonacci sequence.

以這種方式寫入意味着這個相同的過程將遞歸地發生。遵循這個邏輯,試着寫下如果n = 3會發生什麼。在第一次致電fibonacci_series時會發生什麼?下一次調用fibonacci_series會如何改變函數返回的內容?

首先我們爲什麼要有var fibonacci_series = function(n),爲什麼不只是有一個函數叫做function fibonacci_series(n)

爲了您的目的,沒有什麼區別。技術上的答案是,第一個是function expression,第二個是function declaration.如果你對它們有不同的細節感興趣,check out this Stack Overflow question.

+1

哇。這件事突然變得有意義。他們想如何使用.length是非常有創意的。老實說,從來沒有想到這一點。我之前只是在反覆地做這件事。非常感謝 –

+0

@Munt不用擔心!我不會說謊,但當我第一次瞭解到這件事的時候,我記得這件事讓我心生疑慮。 –

2

這兩行做幾乎同樣的事情(見here更多的細節,但在批示說,這可能是你不相關的現在):

var fibonacci_series = function (n) 

function fibonacci_series(n) 

兩個定義一個函數稱爲fibonacci_series,它以n爲參數,它只是一個變體。

斐波那契數列函數是一個遞歸函數,它意味着它在自己的體內調用自己(例如函數內部有)。

n = 2,s等於fibonnacci_series(1)的值時,這是if語句返回的值。

+4

實際上有一些細微的差異,但它們可能與OPs無關題。見[例如](http://stackoverflow.com/a/5857498/1250301) –

+0

@MattBurland謝謝我編輯更多更清晰 –

+0

謝謝,我明白了! –

1

n = 2時,s成爲n - 1(即[0,1])的遞歸調用的結果。然後,s.push(s[s.length - 1] + s[s.length - 2])推動了第二個元素與最後一個元素的相加,這就是斐波那契數列的獲得方式。

這是fibonacci序列的遞歸實現。它也可以通過迭代完成。

+0

當s = 2時,s = fibonacci_series(1)。這是什麼意思?我不明白fibonacci_series(1)究竟意味着什麼。這是否意味着s = [0,1]? –

+0

我想我明白了,謝謝! –

+0

基本上,是的。聲明's = fibonacci_series(n-1)'是一個遞歸調用。由於在這種情況下'n = 2',函數將再次以'n = 1'調用。如果你查看'n = 1'時的返回值,你會看到它返回'[0,1]'。因此,s = [0,1]'。 –