【步兵 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~
之前
真爱无价,欢迎打赏~
相关文章推荐
- C#中尾递归的使用、优化及编译器优化
- 详解Lua中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言