Lua вычисление итоговых значений в таблице определенным образом - PullRequest
0 голосов
/ 16 октября 2018
local t = {1, 2, 3, 4, 5}

Мне нужно вычислить суммарные значения t, из таблицы должно быть 15 выводов. Это упрощенная версия более сложной задачи, и мне нужно вычислить итоговые значения определенным образом, этодолжно выглядеть так:

t = {1, 2, 3, 4, 5}
t = {3, 3, 4, 5} -- the first index is 3, from 1+2 (adding the first and second index value in the table
t = {6, 4, 5} -- the first index is 6, from 3+3
t = {10, 5} -- the first index is 10, from 6+4 
t = {15} -- 15 = 10+5

расчет должен остановиться, когда в таблице осталось одно значение.Как мне это кодировать?

пока я пробовал это, не повезло

local t = {1,2,3,4,5}
local t2 = {}
--code below runs in a loop, code above doesnt
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) -- total values in t just went higher than before, doesnt work.

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы создаете таблицы над циклом.Внутри цикла вы только извлекаете и добавляете значения в существующие таблицы, но для того, чтобы ваш код работал, вам нужно генерировать новые таблицы на каждой итерации.

Помещение 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 нечетно.

Попробуйте подумать об альтернативных способах, которые не включают создание новых таблиц или перемещения большого хвоста массива.По крайней мере, посмотрите руководство по очередям , которые, вероятно, являются более сложным приемом, чем тот, который необходим.

0 голосов
/ 18 октября 2018

Будет ли это работать?Вы продолжаете извлекать первое значение из таблицы и добавляете это значение в новое первое значение.

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

Этот код изменяет текущую таблицу каждый раз, когда она повторяется, и не создает новую таблицу.

0 голосов
/ 16 октября 2018

Попробуйте этот код:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...