斐波那契序列在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 - 2
和n - 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)
});
相关文章:
- JavaScript回调函数
- 如何在javascript回调函数中返回多个变量
- Google Data API上的OOP Javascript回调方法
- JavaScript回调函数和Google Feed API
- 行上的Primefaces数据表选择javascript回调
- 使用jasmine测试JavaScript回调函数
- 当页面中的某些脚本已经执行时,javascript回调
- 性能惩罚JavaScript回调函数
- JavaScript回调问题
- 需要Javascript回调ajax解释
- 未通过单击按钮调用JavaScript回调
- Google+登录JavaScript回调问题
- 在对象内完成ajax调用后触发Javascript回调
- 独立线程上的Javascript回调函数
- 循环函数(Javascript回调帮助)
- 使用JavaScript回调函数了解变量作用域和闭包
- 带有参数的Javascript回调函数
- 带有数据库的Javascript回调
- Node.js/express,javascript回调函数未执行
- javascript回调如何知道它们的参数