Javascript中带回调的Fibonnaci序列
尝试学习javascript和回调。我错过了什么? 已编辑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) {
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序列,所以没有必要每次都计算序列