我正在研究Free Code Camp exercise。
返回所有奇数斐波纳契数的总和,包括 如果它是斐波纳契数,则传递数字。 Fibonacci序列的前几个数字是1,1,2,3,5和 8,每个后续数字是前两个数字的总和。
这就是我到目前为止所拥有的......
有什么建议吗?
True
所有我回来的都是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;
}
,这似乎很奇怪,因为我认为我的代码中的这一部分非常酷 - 使用函数值来检查if语句。
undefined
答案 0 :(得分: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是真正的交易。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
您可以先为前一个数字,当前数字和总斐波那契定义变量
要检查奇数,可以使用if语句并使用%:
if(currNum%2!== 0){}
如果当前数字为奇数,则将其添加到总数
fibTotal + = currNumber;
要确定您的下一个斐波那契数字,您需要添加上一个和当前数字:
var nextNumber = prevNumber + currNumber;
您需要将之前的号码更新为当前号码
prevNumber = currNumber;
将当前数字设置为序列
中的下一个斐波纳契数currNumber = nextNumber;
希望这有帮助。