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

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.

问题分析

  1. 内存溢出原因:new_set ∘.× new_set生成100×100=10000个元素的矩阵,⊂∘⍕¨会为每个元素生成字符串并包裹成独立的标量数组,再加上外层的函数映射,产生大量冗余数组结构,超出了512KB的工作区限制。
  2. 结果格式问题:第三行代码语法错误,压缩函数/的操作数顺序颠倒,导致没有用布尔筛选器去压缩乘积数组,反而输出了回文判断的二进制结果。

解决方案

优化后的代码

简化回文判断逻辑,去除不必要的数组嵌套,同时修正压缩函数的语法:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:55:25