OpenSCAD for循环内ofs变量无法迭代累加问题求解
问题原因
OpenSCAD属于声明式的函数式编程语言,不支持可变变量:你在for循环内部对ofs的赋值仅在当前单次迭代的局部作用域生效,下一轮迭代读取的ofs永远是外层定义的初始值0,无法在多轮迭代之间共享变量状态,因此无法实现你预期的累加效果。
另外补充说明:你预期的最后一个输出30属于计算错误,5+7+11+17的累加总和为40,正确累加序列应为5,12,23,40。
解决方案
方案1:预计算前缀和数组(推荐)
通过递归函数预先生成所有累加值组成的前缀和数组,直接遍历数组即可:
slots = [5, 7, 11, 17]; // 递归生成前缀和数组 function prefix_sum(arr, idx = 0, acc = 0) = idx >= len(arr) ? [] : concat([acc + arr[idx]], prefix_sum(arr, idx + 1, acc + arr[idx])); ofs_list = prefix_sum(slots); for (ofs = ofs_list) { echo(ofs); translate([ofs, 0, 0]) cube([1, 50, 30]); }
运行后echo输出依次为5, 12, 23, 40,符合累加需求。
方案2:迭代中实时计算前缀和
如果数组长度较短,也可以在循环中按索引实时计算从第一个元素到当前元素的总和,无需额外写递归函数:
slots = [5, 7, 11, 17]; for (i = [0:len(slots)-1]) { // 计算前i+1个元素的累加和(OpenSCAD 2021及以上版本内置sum函数) ofs = sum([for (j = [0:i]) slots[j]]); echo(ofs); translate([ofs, 0, 0]) cube([1, 50, 30]); }
如果使用低于2021版的OpenSCAD,没有内置sum函数,可以自行添加sum函数实现:
function sum(arr, idx = 0, acc = 0) = idx >= len(arr) ? acc : sum(arr, idx + 1, acc + arr[idx]);
内容的提问来源于stack exchange,提问作者Hooga Booga
相关产品推荐
相关产品推荐

