求助:While循环在fourMil<=0时仍持续运行的问题
咱们来拆解你的问题:你想计算四百万以内的斐波那契偶数之和,但当前代码里的while循环停不下来,核心问题出在逻辑倒置和循环结构错误上,咱们一步步理清楚:
你的代码问题分析
循环逻辑完全搞反了
你设置fourMil = 4000000,想用fourMil ≤ 0来终止循环,但你的做法是用4e6去逐个减去偶数斐波那契数——这根本不是“找≤4e6的斐波那契数”的逻辑,反而会让fourMil被反复减去相同的偶数(因为while循环里的for会重复遍历预生成的fibo_list),直到fourMil变负才会停,而且filtered_list会重复添加相同的元素,完全偏离你的需求。预生成斐波那契数的局限性
你固定生成了32个斐波那契数(i=0:31),但这个数量是拍脑袋定的:可能有的数已经超过4e6,或者数量不够,而且这种静态生成的方式不够灵活,也没必要。while循环的执行逻辑错误
只要fourMil > 0,你的while就会反复执行内部的for循环——每一轮while都会把整个fibo_list的偶数再减一遍,这就是循环停不下来的直接原因:除非fourMil被减到≤0,否则while会一直重复这个过程。
修正后的代码方案
咱们换个思路:动态生成斐波那契数,直到数超过4e6,同时筛选偶数并累加,这才是符合需求的逻辑。
方案一:高效累加(不存储列表)
这种方式不需要存储所有斐波那契数,直接在生成过程中判断偶数并累加,性能更好:
% Sum of even Fibonacci numbers not exceeding 4,000,000 clc; clear; sum_even = 0; prev_fibo = 1; % 第一个斐波那契数 curr_fibo = 2; % 第二个斐波那契数 while curr_fibo <= 4000000 if mod(curr_fibo, 2) == 0 sum_even = sum_even + curr_fibo; end % 生成下一个斐波那契数 next_fibo = prev_fibo + curr_fibo; prev_fibo = curr_fibo; curr_fibo = next_fibo; end disp(['Sum of even Fibonacci numbers up to 4,000,000: ', num2str(sum_even)]);
方案二:存储列表后筛选求和
如果你需要保留所有符合条件的斐波那契数,可以先存储再筛选:
% Sum of even Fibonacci numbers not exceeding 4,000,000 clc; clear; fibo_list = []; prev_fibo = 1; curr_fibo = 2; while curr_fibo <= 4000000 fibo_list(end+1) = curr_fibo; next_fibo = prev_fibo + curr_fibo; prev_fibo = curr_fibo; curr_fibo = next_fibo; end % 补上第一个斐波那契数1(它是奇数,不影响偶数和) fibo_list = [1, fibo_list]; % 筛选偶数并求和 filtered_evens = fibo_list(mod(fibo_list, 2) == 0); sum_even = sum(filtered_evens); disp(['Sum of even Fibonacci numbers up to 4,000,000: ', num2str(sum_even)]);
为什么你的循环停不下来?
再强调一遍:你的while循环条件是fourMil > 0,但每次进入while,都会完整遍历一遍预生成的fibo_list,把所有偶数再次从fourMil中扣除——比如第一次遍历后fourMil可能还剩很多,while就会再次执行,重复扣除相同的偶数,直到fourMil被减到≤0。这完全不是你想要的“收集≤4e6的斐波那契偶数”的逻辑,自然会出现循环停不下来的问题。
内容的提问来源于stack exchange,提问作者Santiago Restrepo Serna

