【步兵 lua】尾递归 打印table

本文介绍了如何使用Lua的尾递归优化来清晰地打印table。作者分享了一个使用缩进展示table结构的方法,并强调了尾递归的基础概念,即在函数最后仅调用另一个函数并直接返回其结果,以此避免栈内存的膨胀。文章还通过示例说明了不符合尾递归的情况。

【步兵 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~
之前
真爱无价,欢迎打赏~
赞赏码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值