JavaScript简易while循环未遵循限制阈值问题求助
解决你的while循环停止问题,顺便为你的学习劲头打call!
先为你坚持啃JS的劲头点个赞!函数、闭包、递归这些概念确实一开始会觉得绕,但只要慢慢拆解练习,肯定能掌握的👍
问题根源分析
你的循环条件while(two < end)是在每次循环开始前检查的,一旦条件成立进入循环体,不管你在循环里把two改成多大,都会把循环体里的代码执行完。举个具体的例子:
当two=34、one=21时,34<50成立,进入循环:
- 因为
one!=1,跳过第一个打印 two += one→ 34+21=55,这时候55已经超过50了,但循环已经进来了,所以还是会执行console.log(two)- 接着
one += two→21+55=76,同样会打印这个已经超标的值 - 直到下一次循环开始时,判断
two=55<50不成立,循环才会停止——但这时候已经把超标的值打印出来了
修复方案
要解决这个问题,我们需要确保只有当值小于等于end时才打印,或者调整循环逻辑,在生成下一个值之前先判断是否超过限制。这里给你两种修改思路:
思路1:在打印前检查是否超过限制(基于你的原代码修改)
function fib (one, two, end) { while(two < end) { if (one == 1 && one <= end) console.log(one); two += one; // 打印前先判断是否不超过end if (two <= end) console.log(two); one += two; // 同样判断后再打印 if (one <= end) console.log(one); } } fib(1, 1, 50);
这样修改后,输出就会停在34,不会出现55及更大的数。
思路2:重构循环逻辑,更符合斐波那契数列的生成逻辑
这种写法更清晰,每次先计算下一个值,判断是否超过限制,再更新变量:
function fib(one, two, end) { // 先处理初始值,避免重复打印1 if (one <= end) { console.log(one); // 当one和two相等时(初始情况),只打印一次1 if (two !== one && two <= end) { console.log(two); } } while (true) { const nextNum = one + two; // 超过限制就退出循环 if (nextNum > end) break; console.log(nextNum); // 更新变量,准备下一次循环 one = two; two = nextNum; } } fib(1, 1, 50);
这段代码的输出是1 2 3 5 8 13 21 34,完全符合不超过50的要求。
最后想说的
完全不用抱歉问基础问题!每个开发者都是从这些小问题过来的,遇到问题拆解清楚,慢慢积累就好,继续加油💪
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

