Sum All Odd Fibonacci Numbers - JavaScript Solution & Walkthrough
(13/21) Learn how to solve coding challenges using FreeCodeCamp's curriculum.
12/21 Sum All Odd Fibonacci Numbers
Given a positive integer
num
, return the sum of all odd Fibonacci numbers that are less than or equal tonum
.The first two numbers in the Fibonacci sequence are 1 and 1. Every additional number in the sequence is the sum of the two previous numbers. The first six numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8.
For example,
sumFibs(10)
should return10
because all odd Fibonacci numbers less than or equal to10
are 1, 1, 3, and 5.
function sumFibs(num) {
return num;
}
sumFibs(4);
Credit: FreeCodeCamp.org
Understanding the Challenge
In this, you are expected to create a function called sumFibs()
.
The function takes a positive integer num
as input. It then returns the sum of all odd Fibonacci numbers that are less than or equal to num
.
To get a better understanding of this challenge, you need first understand the Fibonacci sequence.
We are told in the challenge description that "the first two numbers in the Fibonacci sequence are 1 and 1." After these first two numbers, any number that comes next is the sum of the previous two numbers.
So the first six numbers in the Fibonacci sequence is as follows; 1, 1, 2, 3, 5, 8.
Third number is 2 because 1 + 1 = 2. Fourth number is 3 because 1 + 2 = 3. Fifth number is 5 because 2 + 3 = 5. Sixth number is 8 because 3 + 5 = 8.
You get the drill right?
So moving on, here's what the sumFibs()
function in expected to do. Take an input num
and return the sum of all odd numbers in the Fibonacci sequence less than or equal to num
.
For example sumFibs(10)
should return 10
This is because the numbers in the Fibonacci less than or equal to 10 are 1, 1, 2, 3, 5, and 8. Of these, the ones that are odd numbers are 1, 1, 3 and 5. Therefore, 1+1+3+5 equals 10.
Pseudocode
Given an integer (num)
find all numbers in Fibonacci sequence less than or equal to num
store them in an array
filter array to get only the odd numbers
add all the odd numbers in the filtered array
return the sum
Solving the Challenge
To begin, we need an array to store all numbers in the Fibonacci sequence less than or equal to num
. Let's call the array fibArray
. We're informed in the challenge description that the first two numbers in the Fibonacci sequence are 1 and 1.
const fibArray = [1, 1]
With our knowledge of the first two numbers, we can calculate what the subsequent numbers are. Every next number is a sum of the two previous numbers. However, we only need odd Fibonacci numbers that are less than or equal to num
.
For the numbers to be summed up, two conditions must be met. First, the numbers should be less than or equal to num
and they should also be odd numbers.
To get numbers that meet these two conditions, we are going to use a for loop
initialized i = 1
and ends at i <= num
.
for (let i = 1; i <= num; i++) {
const prevNum1 = fibArray[fibArray.length-1]
const prevNum2 = fibArray[fibArray.length-2]
const fibNumber = prevNum1 + prevNum2
if (fibNumber <= num) {
fibArray.push(fibNumber)
}
}
To get the next number in the Fibonacci sequence fibNumber
, we add the previous two numbers prevNum1
and prevNum2
. Then, we check if fibNumber
is less than num
. If it is, we push it to the fibArray
.
At this point, the fibArray
contains all numbers in the Fibonacci sequence less than num
(which is 4 in the case of the example we are working with).
console.log(fibArray) // [1, 1, 2, 3]
As you can see, not all of them are odd numbers. We need a filter to get only the odd numbers.
const fibOddNumbers = fibArray.filter(num => {
return num % 2 == 1
})
Now, when we log fibOddNumbers
, we will get an array of all odd numbers in the Fibonacci sequence less than 4.
console.log(fibOddNumbers) // [1, 1, 3]
Now, we can sum up all the numbers in the fibOddNumbers
array. Let's save it in a variable called sum
.
let sum = 0
fibOddNumbers.forEach(oddNum => {
sum += oddNum
})
Now, all that's left to be done is to return sum
and our function is complete!
return sum
Final Solution
function sumFibs(num) {
const fibArray = [1, 1]
for (let i = 1; i <= num; i++) {
const prevNum1 = fibArray[fibArray.length-1]
const prevNum2 = fibArray[fibArray.length-2]
const fibNumber = prevNum1 + prevNum2
if (fibNumber <= num) {
fibArray.push(fibNumber)
}
}
const fibOddNumbers = fibArray.filter(num => {
return num % 2 == 1
})
let sum = 0
fibOddNumbers.forEach(oddNum => {
sum += oddNum
})
return sum;
}
sumFibs(4); // 5
Congratulations!
You just cracked the 12th challenge in this series.
Cheers and happy coding!