Javascript 递归函数输出值

Javascript 递归函数输出值,javascript,recursion,fibonacci,Javascript,Recursion,Fibonacci,我正在尝试使用JavaScript完成代码战中的kata,以下是说明: The Fibonacci numbers are the numbers in the following integer sequence (Fn): 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ... such as F(n) = F(n-1) + F(n-2) with F(0) = 0 and F(1) = 1. Give

我正在尝试使用JavaScript完成代码战中的kata,以下是说明:

The Fibonacci numbers are the numbers in the following integer sequence (Fn): 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ... such as F(n) = F(n-1) + F(n-2) with F(0) = 0 and F(1) = 1. Given a number, say prod (for product), we search two Fibonacci numbers F(n) and F(n+1) verifying F(n) * F(n+1) = prod. Your function productFib takes an integer (prod) and returns an array: [F(n), F(n+1), true] or {F(n), F(n+1), 1} or (F(n), F(n+1), True) depending on the language if F(n) * F(n+1) = prod. If you don't find two consecutive F(m) verifying F(m) * F(m+1) = prod you will return [F(m), F(m+1), false] or {F(n), F(n+1), 0} or (F(n), F(n+1), False) F(m) being the smallest one such as F(m) * F(m+1) > prod. Examples productFib(714) # should return [21, 34, true], # since F(8) = 21, F(9) = 34 and 714 = 21 * 34 productFib(800) # should return [34, 55, false], # since F(8) = 21, F(9) = 34, F(10) = 55 and 21 * 3 你们能解释一下发生了什么吗?

只需从返回值中删除
(a+b)+

替换

 return (a + b) + fib(b, a+b, prod);

只需从返回值中删除
(a+b)+

替换

 return (a + b) + fib(b, a+b, prod);


您的
fib
函数有一种情况,即返回单个非数组值:

return (a + b) + fib(b, a+b, prod);
…在两种情况下,它返回对数组的引用:

return [a,b,true];
// and
return [a,b,false];
第一个在
+
操作中使用返回值。这会将数组强制为字符串,从而生成转换为字符串的以逗号分隔的条目列表,然后执行字符串连接

您可能不想在其中执行字符串连接
return
。只需将其更改为
返回fib(b,a+b,prod)似乎解决了问题:

函数productFib(prod){
返回fib(0,1,prod);
}
函数fib(a、b、prod){
如果(a*bconsole.log(productFib(4895));//[55,89,true]
您的
fib
函数有一种情况,即返回单个非数组值:

return (a + b) + fib(b, a+b, prod);
…在两种情况下,它返回对数组的引用:

return [a,b,true];
// and
return [a,b,false];
第一个在
+
操作中使用返回值。这会将数组强制为字符串,从而生成转换为字符串的以逗号分隔的条目列表,然后执行字符串连接

您可能不想在其中执行字符串连接
return
。只需将其更改为
返回fib(b,a+b,prod)似乎解决了问题:

函数productFib(prod){
返回fib(0,1,prod);
}
函数fib(a、b、prod){
如果(a*bconsole.log(productFib(4895));//[55,89,true]
fib()
有时返回一个数组,最后作为
+
的操作数,将其转换为字符串。
fib()
有时返回一个数组,最后作为
+
的操作数,将其转换为字符串。“What”只在没有“why”的情况下非常有用。我同意,这不是最好的答案,我必须管理我专注于快速帮助,因为我知道在做katas时没有发现错误是多么令人沮丧。“什么”没有“为什么”是非常有用的。我同意,这不是最好的答案,我必须管理我专注于快速帮助,因为我知道在执行katas时没有发现错误是多么令人沮丧。这将解决奇怪的输出,但代码仍然是错误的——他必须在执行katas时“回滚”。他的代码没有这样做。我还是给了+1,因为这是OP不理解的大问题。@Hogan:我已经把这篇文章变成了一个社区维基,如果你想进一步回答的话…:-)(我保证你比我更了解斐波那契级数…)事实上我认为这是正确的,因为我刚刚重新阅读了要求,他希望第一个等于或大于-,这是。。。出于某种原因,我的想法等于或小于。@Hogan:很容易做到。:-)非常感谢你!!我认为有时可能与返回数组有关,但没有考虑串联,非常感谢您的解释,我现在看到了我的错误。这将解决奇怪的输出,但代码仍然是错误的——他必须在检查时“回滚”。他的代码没有这样做。我还是给了+1,因为这是OP不理解的大问题。@Hogan:我已经把这篇文章变成了一个社区维基,如果你想进一步回答的话…:-)(我保证你比我更了解斐波那契级数…)事实上我认为这是正确的,因为我刚刚重新阅读了要求,他希望第一个等于或大于-,这是。。。出于某种原因,我的想法等于或小于。@Hogan:很容易做到。:-)非常感谢你!!我认为它有时可能与返回数组有关,但没有考虑连接,非常感谢您的解释,我现在明白我的错误了。