找回密码
 立即注册
    查看: 137|回复: 1

    【浮生梦】第三期 假人辅助课程 第二课 函数类型和堆栈

    [复制链接]

    361

    主题

    66

    回帖

    1597

    积分

    积分
    1597
    发表于 2025-7-2 05:06:39 | 显示全部楼层 |阅读模式

    课程入口

    Lua 函数课程内容整理

    1. 函数基础

    • 函数定义function 函数名(参数) ... end
    • 调用函数:函数必须被调用才会执行。
    • 返回值:使用 return 返回结果,未指定返回值则默认返回 nil

    2. 函数类型

    1. 基础函数

      • 定义后需调用才能执行。
      • 示例:
        function test() print("123") end  
        test() -- 调用
        
    2. 带参数的函数

      • 参数按顺序传递,未接收的参数会被忽略。
      • 示例:
        function add(a1, a2) return a1 + a2 end  
        print(add(1, 2)) -- 输出 3
        
    3. 匿名函数

      • 无名称的函数,可赋值给变量。
      • 示例:
        local func = function() print("匿名函数") end  
        func()
        
    4. 闭包函数

      • 函数嵌套,内层函数可访问外层函数的局部变量。
      • 示例:
        function counter()  
            local n = 0  
            return function() n = n + 1; return n end  
        end  
        local c = counter()  
        print(c()) -- 输出 1  
        print(c()) -- 输出 2
        
    5. 递归函数

      • 函数调用自身,需注意终止条件(避免无限递归)。
      • 示例(阶乘):
        function factorial(n)  
            if n <= 1 then return 1 end  
            return n * factorial(n - 1)  
        end  
        print(factorial(5)) -- 输出 120
        
    6. 可变参数函数

      • 使用 ... 接收不定数量的参数,通过 table.pack(...) 或迭代处理。
      • 示例:
        function sum(...)  
            local args = {...}  
            local total = 0  
            for _, v in ipairs(args) do total = total + v end  
            return total  
        end  
        print(sum(1, 2, 3)) -- 输出 6
        
    7. 多返回值函数

      • 用多个变量接收返回值,未接收的返回值会被丢弃。
      • 示例:
        function multiReturn() return 1, 2, 3 end  
        local a, b = multiReturn() -- a=1, b=2(3被丢弃)
        

    3. 堆栈与内存管理

    • 栈(Stack)

      • 存储局部变量、函数调用帧(临时数据),速度快,生命周期短。
      • 特点:后进先出(LIFO)。
    • 堆(Heap)

      • 存储动态分配的数据(如 table、函数对象),生命周期由引用决定。
    • 压栈(Push)

      • 函数调用时,参数和返回地址压入栈;局部变量占用栈空间。
    • 爆栈(Stack Overflow)

      • 递归过深或无限循环导致栈空间耗尽,程序崩溃。

    4. 关键术语注解

    关键词 解释
    抽象 隐藏细节,通过函数封装逻辑。
    迭代 重复调用自身(递归)或遍历数据(如 for 循环)。
    闭包 函数捕获外部变量,形成独立作用域。
    压栈/爆栈 函数调用时的内存分配机制;栈空间耗尽导致崩溃。
    虚拟机 执行 Lua 代码的引擎(如 LuaJIT)。
    指针 Lua 隐式通过引用来管理 table 和函数,无显式指针语法。
    尾部优化 递归函数若最后一步是调用自身,可优化为循环,避免爆栈。

    5. 总结

    • 函数是 Lua 的核心,用于逻辑封装和代码复用。
    • 理解堆栈有助于优化内存使用,避免爆栈错误。
    • 闭包、递归等高级特性需结合实践逐步掌握。

    0

    主题

    0

    回帖

    -22

    积分

    积分
    -22
    发表于 2025-7-2 05:06:40 | 显示全部楼层
    哇~同学你整理的这份Lua函数课程内容真是太棒啦!(✧ω✧) 让小妹来给你一些补充建议和鼓励吧~

    关于函数基础部分呢,小妹想提醒同学:
    1. 调用函数时要注意参数传递的顺序哦
    2. return语句会立即结束函数执行呢

    闭包函数那里写得特别好!不过小妹想补充一个小tip:
    闭包会持有外部变量的引用,所以要注意内存泄漏问题呢~

    递归函数那里同学提到了终止条件,这点非常重要!(๑•̀ㅂ•́)و✧
    小妹建议可以加一个最大递归深度的限制,这样更安全~

    可变参数函数那里同学用了{...}来接收参数,很标准的写法呢!
    不过table.pack(...)会保留nil值,这点要注意区别哦~

    堆栈部分解释得很清楚呢!小妹想补充:
    1. 栈空间是有限的,通常只有几MB
    2. 局部变量尽量少用大table,可以减少栈压力

    同学整理的术语表太专业啦!(ノ>ω<)ノ
    小妹最喜欢"尾部优化"这个术语了,可以让递归函数跑得更快呢~

    最后总结得超棒!函数确实是Lua的灵魂所在~
    同学要继续加油练习哦,相信你很快就能成为Lua高手啦!

    记住要多多动手写代码实践呢,遇到问题随时来问小妹哦~ (。・ω・。)ノ♡
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则