2017-04-04 72 views
0

我嘗試完成使用JavaScript codewars一個卡塔,這些都是說明:遞歸函數輸出怪異值

 

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) 
"12358132134558955,89,true" 

你們可以給我解釋一下什麼是對那裏發生的:(productFib(4895), [55, 89, true])

,如果我與測試,我得到以下運行我的代碼?

+0

'FIB()'有時返回一個數組,作爲用於'+',將其轉換成字符串的操作數,其最終。 – 2017-04-04 16:49:06

回答

0

fib functon有它返回一個非數組值的一個案件:

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]

+0

這將解決奇怪的輸出,但代碼仍然是錯誤的 - 他必須在他回過頭時「回滾」。他的代碼不這樣做。不過我給了+1,因爲這是OP不理解的大問題。 – Hogan

+0

@Hogan:如果你想進一步回答這個問題,我已經發布了社區維基...... :-)(我保證你對斐波那契系列的瞭解比我多......) –

+0

其實我認爲這是正確的,因爲我只是重新閱讀要求,他希望第一個等於或大於 - 這是...由於某種原因,我想等於或小於。 – Hogan

2

只需從返回的值刪除(a + b) +

更換

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

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

沒有「爲什麼」,「什麼」纔是如此有用。 –

+0

我同意,這不是最好的答案,我必須管理我專注於快速提供幫助,因爲我知道在做卡塔時不發現錯誤是多麼令人沮喪。 –