現在有一個需求: 針對一個答題統計, 需要統計近5次的錯誤次數.
思路是, 使用數表去儲存這5次錯誤次數, 然后統計數表
現在有一個5個元素的數表 error_last_5_times = {1, 0, 1, 0 ,1} 其中1表示正確, 0表示錯誤
這里有兩種統計方法:
-- 方法1: 使用迭代數表來統計
error_last_5_times = {1, 0, 1, 0 ,1}
total1 = function (error_last_5_times)
local wrong_times = 0
for i = 1, 5 do
if error_last_5_times[i] == 0 then
wrong_times = wrong_times + 1
end
end
return wrong_times
end
-- 方法2: 使用字串統計
error_last_5_times = {1, 0, 1, 0 ,1}
total2 = function (error_last_5_times)
local _, wrong_times
-- 將數表轉化為字串, 統計替換字串中"0"的次數
_, wrong_times = table.concat(error_last_5_times, ""):gsub("0", "")
return wrong_times
end
通常而言, total1 函式會更快一些, 但是可讀性上不是很好.
total2 函式因為使用到了兩個內置函式( table.concat 和 string.gsub )去處理, 可讀性上會更高, 但是效率會稍微差上一些, 這一點點出來之后稍微回看一下代碼就可以比較清楚的理解了.
還有一個新的需求: 因為是一個答題模擬, 所以不斷地有新的資料傳入, 需要將新資料答題的正確或者錯誤, 寫入 error_last_5_times 這個表中, 但是需要統計的還是近5次的錯誤次數.
也就是, 需要一個添加新資料的函式.
一樣的, 我們看兩個函式:
-- 方法1: 使用回圈快取結構去添加新資料
-- 在`error_last_5_times`表中添加一個鍵`index`, 用來快取回圈數
error_last_5_times = {1, 0, 1, 0 ,1 , index = 0}
add1 = function (error_last_5_times, value)
-- 使用余數進行限制回圈
error_last_5_times.index = (error_last_5_times.index % 5) + 1
error_last_5_times[error_last_5_times.index] = value
return error_last_5_times
end
在上面這個方法中, 使用了一個回圈快取結構去添加新資料, 即 error_last_5_times.index 是一個從1~5逐步回圈的數, 當超過6的數出現時, 會回滾到前面的索引并覆寫原來的資料, 這使得添加新資料并不需要很高的運算.
-- 方法2: 使用內置表操作函式去添加新資料
error_last_5_times = {1, 0, 1, 0 ,1}
add2 = function (error_last_5_times, value)
table.insert(error_last_5_times, 1, value)
table.remove(error_last_5_times)
return error_last_5_times
end
在這一個方法中, 每次添加新資料, 會使用 table.inset 在 error_last_5_times 的第一個元素添加新的正確率資料, 并使用 table.remove 洗掉最后一個資料, 由于Lua中移動表的效率較低, 所以很明顯, 這也是一個增加可讀性以減少程式效率的方法.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/540236.html
標籤:其他
上一篇:初試高云FPGA
