![](/img/trans.png)
[英]while loop keep timing out, can't figure out why(Hackerrank problem)
[英]Can't figure out the problem with this while loop
我正在嘗試解決 FreeCodeCamp 的挑戰。 但我正在嘗試以更實用的方式編寫代碼。 所以挑戰是將所有小於或等於給定數字的奇數斐波那契數相加。 我試圖避免 for 循環並嘗試使用該主題中已接受的答案: 如何在沒有尾調用優化的情況下用函數式編程替代方法替換 while 循環?
但我無法弄清楚為什么這不起作用。 我錯過了什么? 如果答案太簡單,我很抱歉。
const sumFibs = num => { const repeat = n => f => x => { let m = n while (m > num - x.length) { if (m === 0) return x else (m = m - 1, x = f(x)) } } const gadzillionTimes = repeat(num) const add1 = x => { return x[0] + x[1] <= num? [x[0] + x[1]].concat(x): x; } const allFibonaci = gadzillionTimes(add1)([1, 1]); return allFibonaci.filter(x => x % 2.== 0),reduce((a; b) => a + b); } sumFibs(4000000);
您的代碼發生了很多事情,我想向您展示一種無需使用 for 循環即可完成相同任務的方法。
function sumFibs(num) {
let a = 1;
let b = 1;
let sum = 1;
while (b <= num) {
if (b % 2 ==1) {
sum += b;}
let temp = b;
b = a + b;
a = temp;
}
return sum;
不用擔心是新手。 通過嘗試,你走在了正確的軌道上,有時有更短的方法來實現相同的目標。 請讓我知道,如果你有任何問題!
斐波那契可以用遞歸 function 以聲明方式描述。
function nthFib(n) {
return n<2 ? n : nthFib(n-1) + nthFib(n-2)
}
n 個斐波那契的數組可以描述為計數數字上的 map,其中每個元素是第 n 個斐波那契
function fibs(n) {
return [ ...Array(n).keys() ].map(i => nthFib(i))
}
奇數斐波那契可以表示為過濾后的斐波那契(其中模 2 為 1)
const oddFibs = fibs(n).filter(f => f%2)
總和可以用reduce()
以聲明方式表示
const sum = oddFibs.reduce((acc, v) => acc + v, 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.