【问题标题】:Javascript Fibonacci methodJavascript 斐波那契方法
【发布时间】:2016-06-09 19:26:59
【问题描述】:

所以我创建了斐波那契数列,但是我在 w3resources 上找到的方式对于初学者来说有点令人困惑。当n = 2 时到底会发生什么? s 变成了 fibonnacci_series(1),但这到底意味着什么?首先,为什么我们有 var fibonacci_series = function(n) ,为什么不只是有一个名为 function fibonacci_series(n) 的函数?

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));

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这两行几乎做同样的事情(有关更多详细信息,请参阅here,但正如 cmets 中所说,这可能与您现在无关):

    var fibonacci_series = function (n)   
    
    function fibonacci_series(n)
    

    两者都定义了一个名为fibonacci_series 的函数,它以n 作为参数,它只是一个变体。

    斐波那契数列函数是一个递归函数,这意味着它在函数体中调用自身(例如函数内部有fibonnacci_series(n-1))。

    n = 2 时,s 等于fibonnacci_series(1) 的值,这就是if 语句返回的值。

    【讨论】:

    • 实际上存在一些细微的差异,但它们可能与 OPs 问题无关。见for example
    【解决方案2】:

    n = 2 时,s 成为递归调用n - 1(即[0,1])的结果。然后,s.push(s[s.length - 1] + s[s.length - 2]) 正在推动将倒数第二个元素与最后一个元素相加,这就是获得斐波那契数列的方式。

    这是斐波那契数列的递归实现。也可以通过迭代来完成。

    【讨论】:

    • 当 s = 2 时,s = fibonacci_series(1)。这是什么意思?我不明白 fibonacci_series(1) 的确切含义。这只是意味着 s = [0,1] 吗?
    • 基本上,是的。语句s = fibonacci_series(n - 1) 是一个递归调用。由于在这种情况下为n = 2,因此将使用n = 1 再次调用该函数。如果您查看n = 1 时的情况的返回值,您会看到它返回[0,1]。因此,s = [0,1].
    【解决方案3】:

    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.

    【讨论】:

    • 哇。这件事突然变得有意义了。他们对使用 .length 的想法非常有创意。老实说,绝对不会想到这一点。我之前只是在迭代地做。非常感谢
    • @Munt 不用担心!不会撒谎,我记得当我第一次知道这件事时,这件事让我大吃一惊。
    猜你喜欢
    • 2014-05-19
    • 2013-09-29
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2010-10-12
    • 2021-04-19
    • 2021-04-04
    • 2019-12-19
    相关资源
    最近更新 更多