斐波那契序列在Javascript中的回调

Fibonnaci Sequence with Callback in Javascript

本文关键字:Javascript 回调      更新时间:2023-09-26

尝试学习javascript和回调。我遗漏了什么?

var fibNumber = function(n, callback)
{
  if (n < 2){
    return 1;
  }else{
    return function(n-2) + function(n-1);
  }
  callback(n)
}
var n = console.log(prompt("An integer please: ");
fibNumber(n, function(n)
{
  console.log(n)
});

无法理解通过传递x和y的值要完成什么。

如果你只想打印前N个数字的斐波那契数列,我已经写了这段代码。

var fibNumbers = function(n, callback){
    var series = [];
    var temp;
    for (var i = 0; i <= n; i++){
        if(i == 0 || i == 1){
            temp = 1;
        }else{
            temp = series[i-1] + series[i-2];
        }

        series.push(temp);
    }
    callback(series); //calling the callback here with argument series array containing the series
}
fibNumbers(30, function(result){
    console.log(result); //will console log the series
});

如果你想在最终计算后调用回调函数并获得fibo序列的值,那么这将是你的一种方法:

function fibo(n, callWithSeries) {
  fibo.series = fibo.series || [1];
  fibo.f(n);
  callWithSeries(fibo.series.slice(0, n + 1));
  return fibo.series[n];
}
fibo.f = function(n) {
  if (fibo.series[n])
    return fibo.series[n];
  if (n < 2)
    return (fibo.series[n] = 1);
  return (fibo.series[n] = fibo.f(n - 1) + fibo.f(n - 2));
};
var res = fibo(6, s => console.log(s));
console.log('result: ', res);
res = fibo(2, s => console.log(s));
console.log('result: ', res);

变化:

  • 命名函数fibNumber -不需要。
  • fibNumber作为callback的闭包
  • 命名函数f。计算斐波那契数的原点函数。
  • 这个函数被调用然后返回。递归开始的部分。
  • f内部进行检查并调用callback。然后用n - 2n - 1正确调用f (function不是函数名)。返回结果
  • 您尝试返回console.log而不是prompt的结果。这行不通。将这两部分分成两部分,并将数值赋给n。然后输出
  • 调用fibNumber回调并输出结果

function fibNumber(n, callback) {
     function f(n) {
        if (n < 2) {
            return 1;
        } else {
            callback(n);
            return f(n - 2) + f(n - 1);
        }
     }
     return f(n);
}
var n = +prompt("An integer please: ");
console.log(n);
console.log(fibNumber(n, function (n) { console.log(n); }));

一些问题:

  • 由于您总是在到达callback调用之前执行return语句,因此永远不会执行。所以,不要返回,而是将结果存储在一个变量中,然后调用callback,然后返回该值。
  • 调用function语法不正确,您需要调用fibNumber
  • 递归调用fibNumber时,不提供callback参数。这是可以的,但是你应该在调用callback之前测试你是否已经收到了这个参数。否则在调用undefined时会得到错误。
  • 在提示输入的语句中缺少一个右括号。
  • console.log(prompt(...))不返回输入值,至少不是在所有浏览器中。单独执行console.log(n)
  • 您不将输入转换为数字:通过prompt接收的输入始终是字符串。如果没有这种转换,函数中的n < 2比较将永远不会为真,因此您将陷入无限递归。
  • 使用+酉运算符将输入转换为数字。
  • 不是问题,但是在主代码中使用n作为输入和输出是令人困惑的。最好使用不同的变量名。

这是你的代码更正:

var fibNumber = function(n, callback)
{
  var result; // for temporary storage of value to be returned
  if (n < 2){
    result = 1;
  }else{
    // You cannot call "function", you need to call "fibNumber"
    result = fibNumber(n-2) + fibNumber(n-1);
  }
  // Only call callback when it was provided
  if (callback) callback(result);
  // also return it:
  return result;
}
var n = +prompt("An integer please: "); // cast input to number
console.log('input: ', n); // don't use console.log to get `n`.
fibNumber(n, function(result) // use different name
{
  console.log('result: ', result)
});