递归函数输出奇怪的值

时间:2017-04-04 16:43:52

标签: 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.
    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"
你能告诉我那里发生了什么吗?

2 个答案:

答案 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);似乎可以解决问题:

&#13;
&#13;
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;
&#13;
&#13;