Lua生成子集函数仅返回空表,请求问题排查与解决帮助
Lua子集生成函数的问题分析与修复
问题根源
你遇到的问题核心是所有子集都引用了同一个res_t表。在递归过程中,你只是不断修改res_t的内容,每次将它添加到res时,存储的是这个表的内存引用,而非当前状态的拷贝。当递归全部结束后,res_t通过多次table.remove被清空,所以res里的所有元素最终都指向这个空表。
修复方案
解决方法很简单:每次需要保存当前子集时,创建一个新表,把res_t的内容复制进去,再将新表存入结果集合。这样每个子集都是独立的表,不会被后续操作影响。
修改后的代码:
function subsets(t) local res = {} local res_t = {} function subs(i) if i > #t then -- 复制当前res_t的内容到新表 local subset = {} for _, val in ipairs(res_t) do subset[#subset + 1] = val end res[#res + 1] = subset return end -- 选择当前元素 res_t[#res_t + 1] = t[i] subs(i + 1) -- 不选择当前元素 table.remove(res_t) subs(i + 1) end subs(1) return res end
验证效果
调用subsets({1, 2, 3})会返回包含所有子集的表,每个子集都是独立的:
-- 返回结果示例 { {1,2,3}, {1,2}, {1,3}, {1}, {2,3}, {2}, {3}, {} }
此时每个子表都是独立的内存对象,修改其中一个不会影响其他子集。
内容的提问来源于stack exchange,提问作者Saf Whale
相关产品推荐
相关产品推荐

