如何让JavaScript斐波那契生成器避免生成两个1?
解决斐波那契序列中出现两个1的问题
你的代码生成的是标准斐波那契序列(以0、1为起始项),按照数学定义,第三项必然是0+1=1,所以连续出现两个1是正常逻辑。如果要避免输出两个1,可以根据你想要的目标序列选择以下方案:
方案1:输出从1起始且无重复1的变种序列
如果希望序列以1开头,且后续直接从2开始(跳过第二个1),可以调整初始值和循环逻辑:
let prev = 1, curr = 2, nextTerm; let number = 10; console.log("Girdiğiniz sayının sırasına kadar olan Fibonacci değerleri:"); // 打印第一个1 console.log(prev); for (let i = 2; i <= number; i++) { console.log(curr); nextTerm = prev + curr; prev = curr; curr = nextTerm; }
输出序列:1,2,3,5,8,13,21,34,55,89
方案2:保留0起始,但跳过第二个1
如果想保留以0开头的序列结构,仅去掉重复的1,可以在循环中添加判断逻辑:
let sayi3 = 0, sayi4 = 1, nextTerm; let number = 10; let count = 0; console.log("Girdiğiniz sayının sırasına kadar olan Fibonacci değerleri:"); while (count < number) { // 跳过第二个1的打印 if (!(sayi3 === 1 && count > 1)) { console.log(sayi3); count++; } nextTerm = sayi3 + sayi4; sayi3 = sayi4; sayi4 = nextTerm; }
输出序列:0,1,2,3,5,8,13,21,34,55
方案3:调整循环打印顺序
通过改变打印和更新的先后逻辑,避免连续输出1:
let a = 0, b = 1, nextTerm; let number = 10; console.log("Girdiğiniz sayının sırasına kadar olan Fibonacci değerleri:"); // 先打印第一个项0 console.log(a); for (let i = 2; i <= number; i++) { nextTerm = a + b; // 跳过第二个1的打印,同时补全总项数 if (nextTerm !== 1 || i !== 3) { console.log(nextTerm); } else { number++; } a = b; b = nextTerm; }
需要注意:方案2和3属于修改了标准斐波那契序列的结构,如果你需要的是符合数学定义的标准序列,那两个1是正常现象,无需调整。
内容的提问来源于stack exchange,提问作者Engin Emre Deniz
相关产品推荐
相关产品推荐

