您的位置:首页 > 编程语言 > Lua

【步兵 lua】尾递归 打印table

2016-06-11 23:30 489 查看

【步兵 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~

之前

真爱无价,欢迎打赏~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua 打印table 尾递归