递归函数输出奇怪的值
recursive function output weird values
我正在尝试使用 JavaScript 在代码战中完成一个套路,这些是说明:
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
好吧,我只需要创建一个斐波那契数列和 return 数组,这是我的代码:
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];
}
}
这是一个递归的斐波那契数列,但是,当我 运行 它没有得到预期的数组时,结果是正确的,变量具有正确的值,但是当 return 数组我得到一个很长的第一个元素,看起来它包含整个斐波那契数列。
这是一个测试用例:(productFib(4895), [55, 89, true])
如果我 运行 我的代码与该测试我得到以下内容:
productFib(4895)
"12358132134558955,89,true"
你们能给我解释一下那里发生了什么吗?
只需从您的 return 值中删除 (a + b) +
:
替换
return (a + b) + fib(b, a+b, prod);
与
return fib(b, a+b, prod);
你的 fib
函数有一种情况,它 return 是一个单一的非数组值:
return (a + b) + fib(b, a+b, prod);
...以及 return 对数组的引用的两种情况:
return [a,b,true];
// and
return [a,b,false];
第一个在 +
操作中使用 return 值。这会将数组强制转换为字符串,生成以逗号分隔的条目列表,这些条目已转换为字符串,然后进行字符串连接。
您可能不想在那个 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]
我正在尝试使用 JavaScript 在代码战中完成一个套路,这些是说明:
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
好吧,我只需要创建一个斐波那契数列和 return 数组,这是我的代码:
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];
}
}
这是一个递归的斐波那契数列,但是,当我 运行 它没有得到预期的数组时,结果是正确的,变量具有正确的值,但是当 return 数组我得到一个很长的第一个元素,看起来它包含整个斐波那契数列。
这是一个测试用例:(productFib(4895), [55, 89, true])
如果我 运行 我的代码与该测试我得到以下内容:
productFib(4895)
"12358132134558955,89,true"
你们能给我解释一下那里发生了什么吗?
只需从您的 return 值中删除 (a + b) +
:
替换
return (a + b) + fib(b, a+b, prod);
与
return fib(b, a+b, prod);
你的 fib
函数有一种情况,它 return 是一个单一的非数组值:
return (a + b) + fib(b, a+b, prod);
...以及 return 对数组的引用的两种情况:
return [a,b,true];
// and
return [a,b,false];
第一个在 +
操作中使用 return 值。这会将数组强制转换为字符串,生成以逗号分隔的条目列表,这些条目已转换为字符串,然后进行字符串连接。
您可能不想在那个 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]