Reputation: 415
My Question
Given a positive integer num, return the sum of all odd Fibonacci numbers that are less than or equal to num.
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 return 10 because all odd Fibonacci numbers less than or equal to 10 are 1, 1, 3, and 5.
My Answer
function sumFibs(num, total = [1, 1]) {
const n = total[total.length - 1] + total[total.length - 2];
if(n > num){
return total;
}
if(n %2 ==0){
total.push(n);
}
return sumFibs(num, total);
}
sumFibs(4);
The Problem
It keeps saying maximum call stack exceeded. I am pretty sure it is because of the second if statement. Any idea how I can fix this?
I even tried this:
function sumFibs(num, total = [1, 1]) {
const n = total[total.length - 1] + total[total.length - 2];
if(n > num){
return total;
}
let x = Array.from(n);
let y = x.filter((item)=>{
return item % 2== 0
})
total.push(...y)
return sumFibs(num, total);
}
sumFibs(4);
Upvotes: 4
Views: 998
Reputation: 23955
For contrast, here's an iterative, O(1)
space, alternative:
function f(n){
if (n < 1)
return 0;
let result = 1;
let a = 1
let b = 1
while (b <= n){
if (b & 1)
result += b;
[a, b] = [b, a + b]
}
return result;
}
console.log(f(10));
console.log(f(4));
console.log(f(75204));
Upvotes: 1
Reputation: 415
I finally got there, so to explain:
I was not adding the even Fibonacci numbers to the array, as pointed out by Pointy. This was making the array incorrect.
This needed to move to the end. Once all of the Fibonacci calculations had been made. Then I could filter and reduce the break out clause of the recursive function:
function sumFibs(num, total = [1, 1]) {
const n = total[total.length - 1] + total[total.length - 2];
if(n > num){
let answer = total.filter((item)=>{
return item % 2 != 0;
}).reduce((totalII, filteredItems)=>{
return totalII + filteredItems
}, 0)
return answer
}
total.push(n)
return sumFibs(num, total);
}
console.log(sumFibs(4));
console.log(sumFibs(75204));
Upvotes: 2