2016-07-02 27 views
0

試圖學習JavaScript和回調。我在這裏錯過了什麼? EDITED使用Javascript回調Fibonnaci序列

var fibNumber = function(n, callback) 
{ 
    if (n < 2){ 
    return 1; 
    }else{ 
    return function(n-2) + function(n-1); 
    } 
    callback(n) 
} 
var n = console.log(prompt("An integer please: "); 
fibNumber(n, function(n) 
{ 
    console.log(n) 
}); 
+1

您從未撥打過電話 – flup

+0

好的,我會替換第一個: console.log(result); with callback(result); ? –

+0

你覺得'a,b = b,a + b;'是做什麼的?你的意思是'[a,b] = [b,a + b];'?另外,將這些數字作爲參數傳遞似乎有點奇怪 - 我期望可能有一個單一的參數,'n',這意味着「給我第* n *個斐波那契數」。你應該做的是什麼? – nnnnnn

回答

0

無法理解你正在試圖通過傳遞x和y的值來完成的。

如果你只是想打印斐波那契數列的前N個數字,我寫了這段代碼。

var fibNumbers = function(n, callback){ 

    var series = []; 

    var temp; 

    for (var i = 0; i <= n; i++){ 

     if(i == 0 || i == 1){ 

      temp = 1; 

     }else{ 

      temp = series[i-1] + series[i-2]; 

     } 


     series.push(temp); 

    } 

    callback(series); //calling the callback here with argument series array containing the series 

} 

fibNumbers(30, function(result){ 

    console.log(result); //will console log the series 

}); 
+0

你的努力是好的,但只是一次很好。如果你重複,你會得到一些不相關的東西。 –

+0

您能否詳細說明一下? @mortezaT –

+0

即使再次調用它也會顯示錯誤。您將每個值都推送到數組而不檢查是否存在。 –

0

發生了什麼變化:

  • 命名功能fibNumber - 沒有必要的。
  • fibNumber作爲關閉工作callback
  • 命名函數f。計算斐波納契數的原點函數。
  • 該函數被調用並返回。遞歸開始的部分。
  • f裏面檢查並調用callback。然後,使用n - 2n - 1作爲ffunction不是名稱的函數)。結果被重新調整。
  • 您嘗試返回console.log而不是prompt的結果。這不起作用。將兩部分分成兩部分,並將數值分配給n。然後製作輸出。使用回調調用fibNumber並輸出結果。

function fibNumber(n, callback) { 
 
    function f(n) { 
 
     if (n < 2) { 
 
      return 1; 
 
     } else { 
 
      callback(n); 
 
      return f(n - 2) + f(n - 1); 
 
     } 
 
    } 
 
    return f(n); 
 
} 
 
var n = +prompt("An integer please: "); 
 

 
console.log(n); 
 
console.log(fibNumber(n, function (n) { console.log(n); }));

0

的一些問題:

  • 正如你總是達到callback的號召,永遠不會得到執行之前執行return聲明。所以,不要返回,而是將結果存儲在變量中,然後調用callback,然後返回該值。
  • 調用function的語法不正確,您需要改爲撥打fibNumber
  • 遞歸調用fibNumber時,不提供callback參數。這是可以的,但是你應該在測試callback之前測試你是否收到了這個參數。否則,您在致電undefined時會收到錯誤信息。
  • 您在提示輸入的語句中缺少右括號。
  • console.log(prompt(...))不返回輸入值,至少不是在所有瀏覽器中。分開執行console.log(n)
  • 您不會將輸入轉換爲數字:通過prompt收到的輸入始終是一個字符串。如果沒有這種轉換,函數中的n < 2比較將永遠不會成立,所以您將進入無限遞歸。用+統一運算符將輸入轉換爲數字。
  • 不是一個問題,但令人困惑的是,在您的主代碼中,輸入和輸出都使用了n。爲此,最好使用不同的變量名稱。

這裏是你的代碼更正:

var fibNumber = function(n, callback) 
 
{ 
 
    var result; // for temporary storage of value to be returned 
 
    if (n < 2){ 
 
    result = 1; 
 
    }else{ 
 
    // You cannot call "function", you need to call "fibNumber" 
 
    result = fibNumber(n-2) + fibNumber(n-1); 
 
    } 
 
    // Only call callback when it was provided 
 
    if (callback) callback(result); 
 
    // also return it: 
 
    return result; 
 
} 
 
var n = +prompt("An integer please: "); // cast input to number 
 
console.log('input: ', n); // don't use console.log to get `n`. 
 
fibNumber(n, function(result) // use different name 
 
{ 
 
    console.log('result: ', result) 
 
});

1

如果你想回調最終計算後調用,並得到FIBO系列高達這個數字那麼這將是一個你的路要走:

function fibo(n, callWithSeries) { 
 
    fibo.series = fibo.series || [1]; 
 

 
    fibo.f(n); 
 
    callWithSeries(fibo.series.slice(0, n + 1)); 
 
    return fibo.series[n]; 
 
} 
 

 
fibo.f = function(n) { 
 
    if (fibo.series[n]) 
 
    return fibo.series[n]; 
 
    if (n < 2) 
 
    return (fibo.series[n] = 1); 
 
    return (fibo.series[n] = fibo.f(n - 1) + fibo.f(n - 2)); 
 
}; 
 

 
var res = fibo(6, s => console.log(s)); 
 
console.log('result: ', res); 
 

 
res = fibo(2, s => console.log(s)); 
 
console.log('result: ', res);

+0

邏輯存在一些問題,您的代碼沒有給出所需的輸出 –

+0

我在未經測試的情況下對其進行了更改。現在檢查它。 –

+0

另外,我沒有得到一件事。你說沒有必要每次計算系列。即使在你的代碼中,它也是在計算每個函數調用(它再次執行整個過程)。如果你能詳細說明,會很棒嗎? –