2016-04-18 61 views
1

我正在通過這個工作Free Code Camp exercise如何獲得javaScript中所有奇數斐波那契數的總和?

如果是斐波納契數,則返回所有奇數斐波那契數的總和,並且包括 通過的數。斐波納契數列的前幾個數字是1,1,2,3,5和 8,每個後續數字是前兩個數字的和。

而且這裏是我迄今爲止...

有什麼建議?

function sumFibs(num) { 
    var arr, isFibVal, isEvenVal, sum, i = 0, fibonacci = function (num){ 
     var a, b, result, fibArr = [1]; 
     a=0; 
     b=1; 
     result=b; 

     for(var j = 0; j < num; j++){ 
      result = a + b; 
      a = b; 
      b = result; 
      fibArr.push(result); 

     } 
     return fibArr; 
    }, 

    isFib = function (val){ 
    var prev = 0; 
    var curr = 1; 
    while(prev<=val){ 
     if(prev == val){ 
     return true; 
     } else { 
     return false; 
     } 
     curr = prev + curr; 
     prev = curr - prev; 
    } 
    }, 

    isEven = function(someNumber){ 
     return (someNumber % 2 === 0) ? true : false; 
    }; 

    function sumArray(array) { 
     for (
     var 
      index = 0,    // The iterator 
      length = array.length, // Cache the array length 
      sum = 0;    // The total amount 
      index < length;   // The "for"-loop condition 
      sum += array[index++] // Add number on each iteration 
    ); 
     return sum; 
    } 


     arr = fibonacci(num); 
     isFibVal = isFib(num); 
     isEvenVal = isEven(num); 


    if (isFibVal && !isEvenVal){ 
     sum += sumArray(arr); 
} 
    return sum; 
} 

所有我得到的回覆是undefined這似乎是奇怪,因爲我認爲我的這部分代碼是函數值來檢查與if語句相當使用冷。

arr = fibonacci(num); 
      isFibVal = isFib(num); 
      isEvenVal = isEven(num); 


    if (isFibVal && !isEvenVal){ 
     sum += sumArray(arr); 
} 

回答

1

我不會給你徹底的,因爲你要通過FCC的答案,但我會爲你提供一些提示,以在哪裏看:

看到這個段:

for(var j = 0; j < num; j++){ 
    result = a + b; 
    a = b; 
    b = result; 
    fibArr.push(result); 
} 

這一個:

function sumArray(array) { 
    for (
    var 
     index = 0,    // The iterator 
     length = array.length, // Cache the array length 
     sum = 0;    // The total amount 
     index < length;   // The "for"-loop condition 
     sum += array[index++] // Add number on each iteration 
); 
    return sum; 
} 

而且,你可能不需要這個網段上的所有:

isFibVal = isFib(num); 
    isEvenVal = isEven(num); 


if (isFibVal && !isEvenVal){ 
    sum += sumArray(arr); 

祝你好運。作爲完成了大部分課程的人,我可以說Free Code Camp是真正的交易。

+0

感謝你的洞察力,所以前兩個是沒有必要?我知道你說三分之三的最後可能根本不需要。 至於Free Code Camp,我最近很受鼓舞。起初,我無法突破許多算法挑戰,但是到最近我一直在連勝,我一直在通過它們。 –

+1

前兩個段需要編輯邏輯。就我而言,第三個是沒有必要的。您可以將第三部分的邏輯實現爲前兩部分,也許可以用一個班輪替換該部分。 FCC是好的。請記住,完成初學者有點難。對於一個完全陌生的人,我建議先開始[codecademy](https://codecademy.com)。 – timolawl

+0

謝謝,我會繼續努力的。 :) 我已經通過codecademy,和類似的(琳達,codeschool等)我的問題一直是實踐。就像學習一門口語一樣,你必須開始鑽研所有的結構,這將有助於傳達你的想法。因爲我一直這樣做 - 實際上打字的東西已經改變了...... –

1

你很接近,對方的回答是好推你在正確的方向,我會後,這是否使用本機JS函數以不同的方式:

Example of the code below in JSBin

function fibs(n) { 
    var f = [0, 1]; 
    var extraNumber = 0; 
    for (var i = 0; i < n; i++) { 
    f.push(f[f.length - 1] + f[f.length - 2]); 
    } 
    // lets check if the passed in number is a fib: 
    if (f.indexOf(n) > -1) { 
    extraNumber = n; 
    } 
    console.log(f); // just to check we can cut all the logs later... 

    var filtered = f.filter(function(num) { 
    // filter out the even numbers 
    return num % 2 === 1; 
    }); 
    console.log(filtered); 

    var sum = filtered.reduce(function(a, b) { 
    // add up whats left 
    return a + b; 
    }); 
    console.log(sum); 
    return sum + extraNumber; 
} 
+0

謝謝JH!我會在早上看看它! –

0
  1. 您可以先定義前一個數字,當前數字和總數的變量斐波納契

  2. 要檢查奇數,你可以使用if語句並使用%:

    if(currNum%2!== 0){}

  3. 如果當前數目爲奇數,則你把它添加到總

    fibTotal + = currNumber;

  4. 爲了確定下一個斐波那契數,你將需要添加前任和現任數:

    VAR nextNumber = prevNumber + currNumber;

  5. 您將需要更新以前的數量到當前

    prevNumber = currNumber;

  6. 設置的當前數目到序列中的下一個Fibonacci數

    currNumber = nextNumber;

希望這會有所幫助。

1

繼承人我的解決方案,我發現它是相當可讀:

function sumOddFibs(num) { 
    // initialize with 2 because 
    // fib sequence starts with 1 and 1 
    var sum = 2; 

    var prev = 1; 
    var curr = 1; 
    var next = 2; 

    while (next <= num) { 
    prev = curr; 
    curr = next; 
    next = prev + curr; 

    if (curr % 2 !== 0) { 
     sum += curr; 
    } 
    } 
    return sum; 
}