APL中压缩大型表格遇WS FULL错误求助
解决APL中压缩回文数时的内存溢出与结果格式问题
问题描述
我需要找出900到1000之间三位数相乘得到的回文数,已经生成了由0/1组成的回文判断表格,但使用压缩函数(/)时触发内存错误:WS FULL: Maximum workspace is 512 kilobytes。即使把new_set改为(⍳10),第三行代码仍然输出二进制结果,急需解决压缩函数的正确使用问题。
用户代码:
new_set ← (900 + ⍳100) {(⊃⍵)≡⌽⊃⍵}¨ ⊂∘⍕¨ (new_set ∘.× new_set) {(⊃⍵)≡⌽⊃⍵}¨ ⊂∘⍕¨ (new_set ∘.× new_set) / ∘⍕¨(new_set ∘.× new_set) WS FULL: Maximum workspace is 512 kilobytes.
问题分析
- 内存溢出原因:
new_set ∘.× new_set生成100×100=10000个元素的矩阵,⊂∘⍕¨会为每个元素生成字符串并包裹成独立的标量数组,再加上外层的函数映射,产生大量冗余数组结构,超出了512KB的工作区限制。 - 结果格式问题:第三行代码语法错误,压缩函数
/的操作数顺序颠倒,导致没有用布尔筛选器去压缩乘积数组,反而输出了回文判断的二进制结果。
解决方案
优化后的代码
简化回文判断逻辑,去除不必要的数组嵌套,同时修正压缩函数的语法:
new_set ← 900 + ⍳100 products ← new_set ∘.× new_set is_palindrome ← {⍵≡⌽⍵} ⍕¨ products // 直接生成字符串数组并判断回文,避免嵌套标量 palindromes ← is_palindrome / products // 用布尔数组筛选出回文乘积
核心优化说明
- 降低内存占用:去掉
⊂∘的嵌套操作,直接用⍕¨生成字符串数组,再用{⍵≡⌽⍵}做回文判断,避免每个元素被单独包裹成标量数组,大幅减少内存开销。 - 修正压缩逻辑:压缩函数
/的左侧必须是布尔筛选数组,右侧是待压缩的目标数组,调整顺序后即可正确筛选出符合条件的回文数。
小数据集验证
当new_set ← ⍳10时,运行上述代码会直接输出1-10两数相乘得到的回文数,而非二进制判断结果:
new_set ← ⍳10 products ← new_set ∘.× new_set is_palindrome ← {⍵≡⌽⍵} ⍕¨ products palindromes ← is_palindrome / products
运行结果示例:1 4 9 11 22 33 44 55 66 77 88 99 121 144 222 256 ...
内容的提问来源于stack exchange,提问作者ArbIn
相关产品推荐
相关产品推荐

