2016-06-09 142 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]'。 –