wxMaxima列表谓词测试内置方法查询及自定义实现优化咨询
内置原生实现
Maxima 已经内置了符合需求的原生函数,无需自定义实现,功能完全匹配你要的「任意/所有成员是否满足谓词」的判断需求:
some(pred, L):判断列表L中是否存在至少一个元素满足谓词pred,存在则返回true,否则返回false,对应「任意成员满足条件」场景。every(pred, L):判断列表L中是否所有元素都满足谓词pred,全部满足则返回true,否则返回false,对应「所有成员满足条件」场景。
示例调用:
/* 判断列表是否存在偶数 */ some(evenp, [1,3,5,7,8]); /* 返回 true */ /* 判断列表是否全为奇数 */ every(oddp, [1,3,5,7,8]); /* 返回 false */
自定义函数优化建议
如果你确实需要自己维护实现版本,可以针对你写的函数做如下优化:
- 去掉无效逻辑:你代码中声明的
length_of_aList变量从未使用,传入参数重复赋值给局部同名变量的操作也没有意义,可直接删除。 - 优化性能:原有实现会先对整个列表执行
map生成所有谓词结果再做判断,长列表下性能浪费严重,可改为遍历列表时遇到第一个符合条件的元素就直接返回结果,无需遍历完整列表。 - 降低调用出错概率:拆分为两个独立的
any、all函数,比传入true_false参数的调用方式更直观,也避免传参错误。
优化后实现示例:
any(pred, L) := block( for item in L do ( if apply(pred, [item]) then return(true) ), false )$ all(pred, L) := block( for item in L do ( if not apply(pred, [item]) then return(false) ), true )$
内容的提问来源于stack exchange,提问作者Rax Adaam
相关产品推荐
相关产品推荐

