Javascript中带回调的Fibonnaci序列

Javascript中带回调的Fibonnaci序列,javascript,callback,Javascript,Callback,尝试学习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) {

尝试学习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)
});
var fibNumber=函数(n,回调)
{
if(n<2){
返回1;
}否则{
返回函数(n-2)+函数(n-1);
}
回调(n)
}
var n=console.log(提示(“请输入一个整数”);
fibNumber(n,函数(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

});
var fibNumbers=函数(n,回调){
var系列=[];
无功温度;
对于(var i=0;i发生了什么变化:

  • 命名函数
    fibNumber
    -不需要
  • fibNumber
    用作
    回调的闭包
  • 命名函数
    f
    。用于计算斐波那契数的原始函数
  • 调用并返回此函数。递归开始的部分
  • f
    内部进行检查并调用
    callback
    。然后使用
    n-2
    n-1
    f
    function
    不是函数的名称)进行正确调用。返回结果
  • 您尝试返回
    控制台.log
    的结果,而不是
    提示符
    。这不起作用。将这两部分一分为二,并将数值指定给
    n
    。然后进行输出
  • 使用回调调用fibNumber
,并输出结果
函数fibNumber(n,回调){
函数f(n){
if(n<2){
返回1;
}否则{
回调(n);
返回f(n-2)+f(n-1);
}
}
返回f(n);
}
var n=+prompt(“请输入一个整数:”);
控制台日志(n);
console.log(fibNumber(n,函数(n){console.log(n);}));
一些问题:

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

var fibNumber=函数(n,回调)
{
var result;//用于临时存储要返回的值
if(n<2){
结果=1;
}否则{
//您不能调用“函数”,您需要调用“fibNumber”
结果=fibNumber(n-2)+fibNumber(n-1);
}
//仅在提供回调时调用回调
如果(回调)回调(结果);
//还请将其退回:
返回结果;
}
var n=+prompt(“请输入一个整数:”;//将输入转换为数字
console.log('input:',n);//不要使用console.log获取'n'。
fibNumber(n,函数(结果)//使用不同的名称
{
console.log('result:',result)

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

函数fibo(n,callWithSeries){
fibo.series=fibo.series | |[1];
fibo.f(n);
callWithSeries(fibo.series.slice(0,n+1));
返回fibo.系列[n];
}
fibo.f=函数(n){
if(fibo.系列[n])
返回fibo.系列[n];
if(n<2)
返回(fibo.级数[n]=1);
返回(fibo.series[n]=fibo.f(n-1)+fibo.f(n-2));
};
var res=fibo(6,s=>console.log);
log('result:',res);
res=fibo(2,s=>console.log);

console.log('result:',res);
你从来不调用回调好的,我会用回调(result);?你认为
a,b=b,a+b;
有什么作用?你是说
[a,b]=[b,a+b]
?另外,将这些数字作为参数传递似乎有点奇怪-我希望可能只有一个参数,
n
,意思是“给我第n个斐波那契数”.你的函数实际应该做什么?是的,显然我没有任何线索。我已经编辑了它,但它仍然不太正确。戏剧性地更改了你要问的代码…这对回答问题的人不太公平。如果你想要实时帮助调试,IRC频道是比堆栈溢出更好的格式,因为它是关于我们的问题除了你自己,你的努力对其他人也是有益的……你的努力很好,但只成功了一次。如果你重复,你会得到一些不相关的东西。你能详细说明一下吗?@mortezaTCall,即使使用相同的号码再次调用,也会显示错误。你将每个值都推送到数组,而不检查是否存在。检查我的编辑。现在对你的情况也很好。我明白你的意思了,如果我一个接一个地调用这个函数两次,它会显示错误的结果。这是因为前面的数组仍然在内存中,具有prev序列,所以没有必要每次都计算序列