如何编写生成小于给定数字 (javascript) 的斐波那契数列的函数?

How to write a function generating Fibonacci series smaller than a given number (javascript)?

这是我的代码:

function fibs(num) {
  //generate Fibonacci numbers:
  let arr = [1,1]
  let i = 2;
  function fibsRange(i) {
    arr[i] = arr[i-1] + arr[i-2]
    if (arr[i] < num) {
      fibsRange(i+1);//call function one more time;
    }
      return arr
  }
  return fibsRange();      
}
console.log(fibs(5)); 

假设给定的数字 (num) 大于 2。我哪里错了?

注意:我编辑了我的代码。

function fibs(num) {
    //generate Fibonacci numbers:
    let arr = [1, 1];
    while(arr[arr.length-1] <= num){
        let y = arr[arr.length-1] + arr[arr.length-2];
        if(y > num){
            break; // break if new y is greater than num
        }
        arr.push(y); // add y to the serie
    }
    return arr; //// return the serie
}
console.log(fibs(50));

首先:正如 Phil 所提到的,您的函数(第一个)需要 return 一些东西。 第二:你不需要 2 个功能,一个就可以完成这项工作。 这是您的代码的工作版本(我还修改了一些不必要的代码。

编辑:当您只需要解析一个参数时,我添加了这种情况

function fibsRange(i,arr,num) {
  if(arr[i-1]+arr[i-2] > num) return arr
  else{
    arr[i] = arr[i - 1] + arr[i - 2]
    return fibsRange(i + 1,arr,num);
  }
}
//in case you need just one parameter
function fib(num){
  let arr = [1, 1];
  let i = 2;
  return fibsRange(i,arr,num);
}

//those(declaration of arr and i) are unnecessary in case you use fib
let arr = [1, 1]
let i = 2;
console.log(fibsRange(i,arr,5));
console.log(fib(5));

您从未调用过 fibsRange() 函数,也从未从 fibs() 返回任何内容。

以下版本有效。

function fibs(num) {
  //generate Fibonacci numbers:
  let arr = [1, 1]
  if (num>1) fibsRange(2); 

  function fibsRange(i) {
    arr[i] = arr[i - 1] + arr[i - 2]
    if (arr[i] < num) {
      fibsRange(i + 1); //call function one more time;
    }       
  }
  return arr;
}
console.log(fibs(5)); //undified;

您的代码正在检查 arr[i] < num,然后调用 fibsRange(i+1)。这是一个错误的逻辑,你总是会得到比 num 更高的斐波那契数,因为你已经将它设置为 arr[i] 然后检查条件。但是,您应该先检查是否 arr[i] < num,然后将其推入 arr.

function fibs(num) {
  //generate Fibonacci numbers:
  let arr = [1, 1];
  let i = 2;
  function fibsRange(i) {
    const lastFibNumber = arr[i - 1] + arr[i - 2];
    if (lastFibNumber < num) {
      arr.push(lastFibNumber);
      fibsRange(i + 1); //call function one more time;
    }
    return arr;
  }
  return fibsRange(i);
}

console.log(fibs(5));