Lua中从表格生成所有组合
2021-1-18 17:40:42
收藏:0
阅读:120
评论:2
我正在尝试迭代通过具有可变数量元素的表格,并获取所有可能的组合,仅使用每个元素一次。我得出了以下解决方案。
arr = {"a","b","c","d","e","f"}
function tablelen(table)
local count = 0
for _ in pairs(table) do
count = count + 1
end
return count
end
function spellsub(table,start,offset)
local str = table[start]
for i = start+offset, (tablelen(table)+1)-(start+offset) do
str = str..","..table[i+1]
end
return str
end
print(spellsub(arr,1,2)) -- 输出: "a,d,e" 正确
print(spellsub(arr,2,2)) -- 输出: "b" 应该是 "b,e,f"
我仍然缺少一些进一步的函数,但我在当前的代码中卡住了。我缺了什么?第一次输出是正确的,但第二次不正确。
点赞
用户6632736
一个使用递归调用的协程迭代器解决方案:
local wrap, yield = coroutine.wrap, coroutine.yield
-- 这个函数会克隆数组 t 并将 new 添加到其中。
local function append (t, new)
local clone = {}
for _, item in ipairs (t) do
clone [#clone + 1] = item
end
clone [#clone + 1] = new
return clone
end
--[[
生成 tbl 中非重复项的组合,
tbl 是项的来源,
sub 是所有生成的组合都应该包含的项的组合,
min 是可以添加到生成的组合中的项的最小键。
--]]
local function unique_combinations (tbl, sub, min)
sub = sub or {}
min = min or 1
return wrap (function ()
if #sub > 0 then
yield (sub) -- 生成短的组合。
end
if #sub < #tbl then
for i = min, #tbl do -- 遍历更长的组合。
for combo in unique_combinations (tbl, append (sub, tbl [i]), i + 1) do
yield (combo)
end
end
end
end)
end
for combo in unique_combinations {'a', 'b', 'c', 'd', 'e', 'f'} do
print (table.concat (combo, ', '))
end
2021-01-18 19:01:52
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

对于像你的具有连续整数键从1开始的表,你可以简单地使用长度运算符
#。你的tablelen函数是多余的。将
table用作本地变量名称会掩盖Lua的表库。我建议您使用tbl或其他不会阻止您使用table方法的名称。您的代码问题可以通过打印一些调试值来解决:
local arr = {"a","b","c","d","e","f"} function spellsub(tbl,start,offset) local str = tbl[start] print("first str:", str) print(string.format("loop from %d to %d", start+offset, #tbl+1-(start+offset))) for i = start+offset, (#tbl+1)-(start+offset) do print(string.format("tbl[%d]: %s", i+1, tbl[i+1])) str = str..","..tbl[i+1] end return str end print(spellsub(arr,1,2)) -- Outputs: "a,d,e" correctly print(spellsub(arr,2,2)) -- Outputs: "b" supposed to be "b,e,f"打印:
first str: a loop from 3 to 4 tbl[4]: d tbl[5]: e a,d,e first str: b loop from 4 to 3 b正如您所看到的,由于起始值已经大于限制值,因此第二个循环没有运行。因此,您仅打印第一个值
b我不理解您的代码与您想要实现的内容有何关联,因此我将把修复留给您。