[Lua语言基础]-13、函数进阶_标准函数库、函数尾调用

[复制链接]
查看3758 | 回复6 | 2021-8-20 15:40:49 | 显示全部楼层 |阅读模式
本帖最后由 Aitlo 于 2021-8-20 19:40 编辑
  1. -- 标准函数库
  2. --[===[Lua的标准函数库也是lua内置函数,主要分为以下三大类:
  3. 数学函数
  4. 字符串函数
  5. 操作系统库
  6. 应用案例:使用操作系统的时间系统函数,配合随机函数,开发准确的随数函数。 ]===]

  7. -- 学习lua语言的函数库
  8. -- 数学函数库、字符串函数库、操作系统库

  9. -- 数学函数库
  10. print(math.abs(-888))                        -- 求绝对值 输出结果:888
  11. print(math.max(1,5,3))                        -- 求最大值        输出结果:5
  12. print(math.min(1,5,3))                        -- 求最小值        输出结果:1
  13. print(math.sin(0))                                -- 求正弦        输出结果:0
  14. print(math.cos(0))                                -- 求余弦        输出结果:1
  15. print(math.sqrt(36))                        -- 求平方根        输出结果:6
  16. print(math.random(1,100))                -- 产生随机数 输出结果:1-100之间的一个数
  17. print(math.floor(18.88))                -- 返回不大于输入数值的整数(即:取整,向下取整不是四舍五入)        输出结果:18

  18. -- 字符串函数
  19. print(string.lower("AbCdeFfg"))        -- 得到全部的小写
  20. print(string.upper("AbCdeFfg"))        -- 得到全部的大写
  21. -- 还有很多...

  22. -- 操作系统库
  23. print(os.date())                                        -- 得到日期
  24. print(os.time())                                        -- 得到时间戳
复制代码
  1. -- 函数尾调用
  2. --[===[lua中可以在一个函数中,使用return返回另一个函数,这种语法称为“尾调用”。
  3. (即:一个函数调用另一个函数的最后一个动作)
  4. eg:
  5. function f(x)
  6. return g(x)
  7. end

  8. ]===]

  9. -- 函数尾调用
  10. -- eg:演示什么是“尾调用”
  11. function FunA()                                -- 不是尾调用
  12.         local res = math.abs(-88)
  13.         return res
  14. end

  15. function FunB()                                -- 不是尾调用
  16.         local res = FunA()
  17.         return res
  18. end

  19. -- 测试调用
  20. res = FunB()
  21. print(res)                                        -- 输出结果:88

  22. function FunA()                                -- 是尾调用
  23.         return math.abs(-66)
  24. end

  25. function FunB()                                -- 是尾调用
  26.         return FunA()
  27. end

  28. -- 测试调用
  29. res = FunB()
  30. print(res)                                        -- 输出结果:66


  31. -- eg:演示递归算法中,尾调用的作用
  32. -- 因为尾调用不占用“堆栈”空间,所有不会出现“栈溢出”,可以起到优化存储空间的作用。
  33. function RecurFunc(num)
  34.         if(num>0)then
  35.                 -- print(num)
  36.                 return RecurFunc(num-1)        -- 这是“尾调用”(递归函数)
  37.                 -- return RecurFunc(num-1)+ 0  -- 不是“尾调用”(递归函数),这里如果进行10W次递归调用,则会报错“stack overflow”栈溢出
  38.         else
  39.                 return "End"
  40.         end
  41. end

  42. -- 测试演示1
  43. res = RecurFunc(10)
  44. print(res)                                        -- 输出结果:End
  45. -- 测试演示2
  46. res = RecurFunc(100000)
  47. print(res)                                        -- 输出结果:End


  48. -- eg:尾调用中括号的作用
  49. function FunC()
  50.         print('FunC')
  51.         return FunD()                        -- 此种方式,返回多个数值
  52.         -- return (FunD())                -- 此种方式,迫使返回一个数值
  53. end

  54. function FunD()
  55.         print('FunD')
  56.         return 100,200
  57. end

  58. -- 测试演示3
  59. res1,res2 = FunC()
  60. print(res1,res2)                                -- 输出结果:End

  61. --[===[注意事项:
  62.         封装函数中的return x() 与 return (x()) 含义不同,后者只能返回一个结果。
  63.     (即:前者返回函数类型,后者是一个数值)
  64. 说明:
  65.         当A函数调用完B函数就再没有可执行的工作时,程序就不需要返回那个B所在的函数。
  66.     所以在尾调用之后程序也不需要保存任何关于该函数的栈信息。
  67.     由于“尾调用”不会耗费栈空间,所以一个程序可以拥有无数嵌套的“尾调用”,
  68.     而不用担心造成栈溢出。
  69.       ]===]
复制代码


回复

使用道具 举报

xywl | 2021-9-1 21:29:40 | 显示全部楼层
谢谢分享
回复

使用道具 举报

jiang2798 | 2021-10-6 20:11:11 | 显示全部楼层
回复

使用道具 举报

skyfloor | 2021-10-11 08:47:49 | 显示全部楼层
函数的自身回调可以用这种方式吗
回复

使用道具 举报

Aitlo | 2021-10-11 10:04:33 | 显示全部楼层
skyfloor 发表于 2021-10-11 08:47
函数的自身回调可以用这种方式吗

回调函数我自认为在写脚本的时候用的比较少
回复

使用道具 举报

lijun0223 | 2021-10-30 10:36:14 | 显示全部楼层
回帖水经验!!!
回复

使用道具 举报

kingty | 2022-7-17 22:27:22 | 显示全部楼层

回帖水经验!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则