Как я могу получить сумму всех нечетных значений Фибоначчи в javaScript?
Я работаю над этим упражнением Free Code Camp.
Возвращает сумму всех нечетных чисел Фибоначчи, включая переданное число, включая число Фибоначчи. Первые несколько чисел последовательности Фибоначчи - 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);
}
4 ответа
Вот мое решение, и я нахожу его довольно читабельным:
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;
}
Я не буду давать вам ответ прямо, так как вы проходите через 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 - это реальная сделка.
Вы довольно близки, и другой ответ хорош для того, чтобы подтолкнуть вас в правильном направлении, я опубликую другой способ, который делает это с помощью нативных функций JS:
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;
}
Вы можете начать с определения переменных для предыдущего числа, текущего числа и общего числа Фибоначчи
Чтобы проверить нечетные числа, вы можете использовать оператор if и использовать%:
if (currNum% 2! == 0) {}
Если текущее число нечетное, то вы добавляете его к общему количеству
fibTotal += currNumber;
Чтобы определить следующий номер Фибоначчи, вам нужно будет добавить предыдущий и текущий номер:
var nextNumber = prevNumber + currNumber;
Вам нужно будет обновить предыдущий номер до текущего
prevNumber = currNumber;
Установить текущее число на следующее число Фибоначчи в последовательности
currNumber = nextNumber;
Надеюсь это поможет.