【步兵 lua】尾递归 打印table by EOS.
脚本语言打印数据结构是很常见的功能,因为脚本语言大多数情况都是用文本编辑区去写,
自然缺少了ide的调试之类的强大功能,但相对的开发环境就轻便了很多。
比如 我,用的就是NodePad++,一个轻量级文本编辑器。
先上图看看效果
如图所示,我用的是缩进形式打印的,个人感觉这样看着更舒服、清晰。
(ps: 而且相对的要简单一些=。=)
尾递归基础
//为了说明分为 1和2,实际上是一个函数
function func1(...)
//干点啥
return func2(...)
end
基本上这个套路就错不了~
尾递归优化就是,执行func1时,在func2后再无其他事情要做,那么就直接结束func1。
不优化是的处理方式是,等待func2执行结束后,回到func1,结束func1。
后者是栈内存一直膨胀的,前者是只保留一个函数的栈内存。
概念嘛,大概就这么多~
(ps:因为return的是func2的结果相当于直接调用func2,所以忽略掉return操作
而且优化处理的正是这部分)
举个错误
function func1(...)
//干点啥
return func2(...)*2
end
这个例子中,对func2的返回结果进行了乘法操作,所以并不是无其他事情可做~,
还有 判断相等不等之类的,只要对返回结果进行操作了,都不是尾递归。
(ps:所以记住,请按套路出牌~)
上代码
table.dump = function (t)
CCLuaLog("\n================== table.dump_Start ==================")
if type(t) == "table" then
table.dump_(table.copy(t))
else
CCLuaLog("error paramType: "..type(t))
if t then
local v = t
if type(v) == "number" then
CCLuaLog("[param] = "..v)
elseif type(v) == "string" then
CCLuaLog("[param] = \""..v.."\"")
elseif type(v) == "boolean" then
CCLuaLog("[param] = "..(v and "true" or "false"))
end
end
end
CCLuaLog("================== table.dump_End ==================\n")
end
table.dump_ = function (t, indent, other)
if not indent and type(t) ~= "table" then return end
if indent == nil then indent = 0 end --缩进默认值
if other == nil then other = {} end --other默认值
if next(t) == nil then
if next(other) == nil then return end --双空结束
indent = indent - 4
return table.dump_(table.remove(other), indent, other)
end
local function getIndentStr()
local tb = {}
for i = 1, indent do
tb[i] = " "
end
return table.concat(tb)
end
--缩进字符串
local indentStr = getIndentStr()
local now = nil
for k,v in pairs(t) do
if type(v) ~= "table" then
if type(v) == "number" then
CCLuaLog(indentStr.."["..k.."] = "..v)
elseif type(v) == "string" then
CCLuaLog(indentStr.."["..k.."] = \""..v.."\"")
elseif type(v) == "boolean" then
CCLuaLog(indentStr.."["..k.."] = "..(v and "true" or "false"))
else
CCLuaLog(indentStr.."["..k.."] is "..type(v))
end
else
now = v
table.insert(other,t)
indent = indent + 4
CCLuaLog(indentStr.."["..k.."] is "..type(v))
end
t[k] = nil
break
end
return table.dump_(now or t, indent, other)
end
又到了睡觉的时间了~ 晚安 = 3=
See Again~
之前
真爱无价,欢迎打赏~