Lua以一定方式计算表格的总值

local t = {1, 2, 3, 4, 5}

我需要计算表格 t 的总值,输出应该为 15。这是一个更复杂问题的简化版本,我需要以一定方式计算总值,应该像这样:

t = {1, 2, 3, 4, 5}
t = {3, 3, 4, 5} -- 第一个索引为 3,来自于 1+2(添加表格中第一个和第二个索引的值)
t = {6, 4, 5} -- 第一个索引为 6,来自于 3+3
t = {10, 5} -- 第一个索引为 10,来自于 6+4
t = {15} -- 15 = 10+5

当表格中只剩下一个值时,计算应该停止。我该如何编写代码?

到目前为止,我试过这个,但没有成功

local t = {1,2,3,4,5}
local t2 = {}
--下面的代码在循环中运行,上面的代码无法运行
table.insert(t2, t[1] + t[2])
table.remove(t, 1)
table.remove(t, 1)
for i,v in pairs(t) do
table.insert(t2, v)
end
table.insert(t, t2[1] + t2[2])
table.remove(t2, 1)
table.remove(t2, 1)
for i,v in pairs(t2) do
table.insert(t, v)
end

print(#t) -- 表格中的总值比之前更高,无法正常工作。
点赞
用户107090
用户107090

尝试这段代码:

local t = {1,2,3,4,5}
while #t>1 do
    table.insert(t,1,table.remove(t,1)+table.remove(t,1))
    print(t[1],#t)
end

这段代码在每一步中将数组向左移动两次,向右移动一次。

这里有一个更少浪费的解决方案,每步只向左移动一次:

local t = {1,2,3,4,5}
while #t>1 do
    t[2]=t[1]+t[2]
    table.remove(t,1)
    print(t[1],#t)
end
2018-10-16 16:08:51
用户4687565
用户4687565

你正在循环上方创建表格。在循环内部,你只弹出并将值添加到现有表格中,但为了使你的代码正常工作,你需要在每次迭代中生成新表格。

在代码行之间放置 print(table.concat(t,', ')) 将有助于你理解发生了什么。以下是“正确”的代码

local t = {1,2,3,4,5}
local t2
while #t>1 do
    t2={}
    table.insert(t2, t[1] + t[2])
    table.remove(t, 1)
    table.remove(t, 1)
    for i,v in pairs(t) do
        table.insert(t2, v)
    end
    print('t',table.concat(t,', '))
    print('t2',table.concat(t2,', '))
    t={}
    table.insert(t, t2[1] + t2[2])
    table.remove(t2, 1)
    table.remove(t2, 1)
    for i,v in pairs(t2) do
        table.insert(t, v)
    end
    print('t',table.concat(t,', '))
    print('t2',table.concat(t2,', '))
end
print(t[1])

对于小问题来说可能并不重要,但一般来说,在循环中进行数组创建和复制是一种不好的风格,会导致性能下降。(尝试将 t = {1,2,3,4,5} 替换为 t={}; for i=1,1e4+1 do t[i]=i; end)。特别是,如果你大部分时间都不使用复制中的大部分元素。另外,上述代码仅在 #t 为奇数时有效。

尝试考虑不涉及创建新表格或移动大型数组尾部的替代方法。至少查看 队列指南 ,这可能比所需的更复杂的技巧。

2018-10-16 16:09:39
用户3379140
用户3379140

这会行吗?你可以将表的第一个值取出,并将其加到新的第一个值上。

local t = {1, 2, 3, 4, 5}

while (#t > 1) do
    local first = t[1];
    table.remove(t, 1);
    t[1] = t[1] + first;
end

这段代码每次循环都会修改当前表,而不是创建一个新表。

2018-10-18 11:01:12