You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Maxima CAS中通过索引批量移除列表元素并保留每第三个元素

解决Maxima中保留列表每第三个元素的问题

嘿,你的问题很典型——在循环里动态修改列表长度确实会搞乱索引,导致逻辑完全出错。我给你几个靠谱的解决方案,一步步来:

方法1:直接生成目标列表(最简洁高效)

既然你一开始就明确要保留每第三个元素,完全不用先生成完整列表再筛选!直接用makelist指定起始值和步长就行:

a: makelist(i, i, 1, 20);
b: makelist(i, i, 3, 20, 3);

运行后b就是[3, 6, 9, 12, 15, 18],完美符合需求,这是最优解。

方法2:用第二个列表收集目标元素(完成你未写完的思路)

你提到的新建列表的思路是对的,只需要补全逻辑就行——遍历原列表的索引,把符合条件的元素添加到新列表:

a: makelist(i, i, 1, 20);
b: [];
l: length(a);
for i: 1 thru l do (
    if mod(i, 3) = 0 then b: endcons(a[i], b)
);

这里endcons是Maxima里把元素添加到列表末尾的函数,遍历完成后b就是你要的结果。

方法3:反向遍历修改原列表(适合必须修改原列表的场景)

如果你一定要直接修改原列表a,那反向遍历索引就能避免动态长度带来的问题——从最后一个元素往前处理,删除不需要的元素,这样前面的元素索引不会被后续操作影响:

a: makelist(i, i, 1, 20);
l: length(a);
for i: l step -1 thru 1 do (
    if mod(i, 3) > 0 then a: delete(a[i], a)
);

运行后原列表a就只剩下每第三个元素了。

为什么你原来的代码不行?

正向遍历的时候,每删除一个元素,后面的元素都会往前移一位。比如你删了索引1的元素,原来索引2的元素就变成了新的索引1,下一次循环到i=2的时候,你实际上操作的是原来索引3的元素,完全打乱了你的判断逻辑,反向遍历就不会有这个问题。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:49:34