我试图使用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
好吧,我只需要创建一个斐波纳契系列和返回数组,这是我的代码:
function productFib(prod) {
return fib(0, 1, prod);
}
function fib(a, b, prod) {
if (a * b < prod) {
return (a + b) + fib(b, a + b, prod);
}
else if (a * b == prod) {
return [a, b, true];
}
else {
return [a, b, false];
}
}
它是一个递归的斐波纳契数列,但是,当我运行它时,我没有得到预期的数组,结果是正确的,变量具有正确的值和所有,但是当返回数组时,我得到一个非常长的第一个元素,看起来它包含整个斐波那契系列。
这是一个测试用例:(productFib(4895), [55, 89, true])
如果我使用该测试运行我的代码,我会得到以下内容:
productFib(4895)
"12358132134558955,89,true"
你能告诉我那里发生了什么吗?
答案 0 :(得分:2)
只需从返回值中删除(a + b) +
:
替换
return (a + b) + fib(b, a+b, prod);
与
return fib(b, a+b, prod);
答案 1 :(得分:1)
您的fib
功能有一种情况,它会返回一个非数组值:
return (a + b) + fib(b, a+b, prod);
...以及它返回对数组的引用的两种情况:
return [a,b,true];
// and
return [a,b,false];
第一个使用+
操作中的返回值。这会将数组强制转换为字符串,该字符串会生成以逗号分隔的条目列表,并将其转换为字符串,然后进行字符串连接。
你可能不想在那个return
中进行字符串连接。简单地将其更改为return fib(b, a + b, prod);
似乎可以解决问题:
function productFib(prod) {
return fib(0, 1, prod);
}
function fib(a, b, prod) {
if (a * b < prod) {
return fib(b, a + b, prod);
} else if (a * b == prod) {
return [a, b, true];
} else {
return [a, b, false];
}
}
console.log(productFib(4895)); // [55, 89, true]
&#13;