我在JavaScript中没想到的简单函数返回数字

时间:2018-07-14 15:38:57

标签: javascript function recursion fibonacci

我在纸上考试中有这个简单的功能。我的回答是9,但是当我回家console.log(fib(6))时,我的游戏8的结果。为什么?

我还问我的教授,他给了我这张图,但我还是不明白。有帮助吗?

fibonacci chart

function fib(num1) {
  if (num1 <= 2) {
    return num1 = 1;
  } else {
    return fib(num1 - 1) + fib(num1 - 2);
  }
}

console.log(fib(6));

2 个答案:

答案 0 :(得分:2)

  

Chart

此图表说明了代码的功能以及基本的斐波那契数字。

以下是该图表的工作方式:

  1. 图表从fib(6)开始。
  2. fib(x) = fib(x - 1) + fib(x - 2)开始,然后fib(6) = fib(5) + fib(4)如图所示,通过向下移动的箭头显示。
  3. 您现在有两个 值包含在最终答案fib(5)fib(4)中。图表显示了如何为他们重复上述过程(将它们分成较小的部分)。
  4. 重复步骤1-3,直到到达fib(2)fib(1)为止,根据定义,它们自动等于1
  5. 最后,将所有1放在图表底部(总共8个)。

以下是您的代码:

function fib(num1) {
  // Start with a number (Step 1 on the chart).
  if (num1 <= 2) {
    // If it is <= 2, return 1 (Step 4 on the chart)
    return num1 = 1;
  } else {
    // Break it down into smaller parts (Step 2 on the chart) 
    // and recursively repeat the process for the new parts (Step 3 on the chart).
    return fib(num1 - 1) + fib(num1 - 2);
  }
}

console.log(fib(6));

答案 1 :(得分:1)

该程序是著名的Fibonacci程序。也就是说,前两个数字之后的每个数字都是前两个数字的和。如:

1 1 2 3 5 8 13.....

如您所见,第六个数字是8。

现在我们正在讨论如何解决此问题。首先,您应该知道重复关系是:

F(i) = F(i - 1) + F(i - 2)

并且F(1)= 1,F(2)= 1。

因此代码应为:

function fib(num1) {
    if (num1 <= 2) return 1;
    return fib(num1 - 1) + fib(num1 - 2);
}

这不是解决此问题的有效方法,因为它具有重叠子问题。您可以尝试通过记忆来解决!