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

Simple function returning number that I didn't expect in JavaScript

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

我也问过我的教授,他给了我这个图表,但我还是没看懂。有帮助吗?

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

console.log(fib(6));

此图表演示了代码的作用以及斐波那契数列的基本含义。

该图表的工作原理如下:

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

这个节目是著名的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);
}

这不是解决这个问题的有效方法,因为它有重叠子问题。你可以尝试背诵来解决!