在Javascript中回调的Fibonnaci序列

时间:2016-07-02 06:51:22

标签: javascript callback

尝试学习javascript和回调。我在这里错过了什么? 的 EDITED

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

4 个答案:

答案 0 :(得分:1)

无法通过传递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

});

答案 1 :(得分:1)

如果您希望在最终计算后调用回调并将fibo系列提升到该数字,那么这将是您的方法之一:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

发生了什么变化:

  • 命名函数apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "24.0.0" defaultConfig { applicationId "com.example.akhil.myapplication" minSdkVersion 22 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0' } - 没必要。
  • fibNumber用作fibNumber
  • 的结尾
  • 命名函数callback。用于计算斐波纳契数的原点函数。
  • 调用此函数然后返回。递归开始的部分。
  • f内进行检查并调用f。然后使用callbackf进行functionn - 2不是函数名称)的rigcht调用。结果重新调整。
  • 您尝试返回n - 1而不是console.log的结果。这不起作用。将两部分拆分为两部分,并将数值指定为prompt。然后输出。
  • 使用回调调用n并输出结果。

fibNumber

答案 3 :(得分:0)

一些问题:

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

以下是您的代码更正:

&#13;
&#13;
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)
});
&#13;
&#13;
&#13;