美文网首页
lua函数互相调用、递归调用

lua函数互相调用、递归调用

作者: 钟离惜 | 来源:发表于2021-02-20 18:24 被阅读0次

在定义局部递归函数( rec ursive local function )时,由于原来的方法不适用,所以有一
点是极易出错的。考虑如下的代码:

local fact = function (n)
    if n == 0 then
        return 1
    else
        return n * fact(n-1) --有问题
    end
end

当Lua 语言编译函数体中的fact(n-1)调用时,局部的fact尚未定义。因此,这个表达式
会尝试调用全局的fact 而非局部的fact。我们可以通过先定义局部变量再定义函数的方式
来解决这个问题:

local fact
fact = function (n)
    if n == 0 then
        return 1
    else
        return n*fact(n-1) --有问题
    end
end

这样,函数内的fact 指向的是局部变量。尽管在定义函数时,这个局部变量的值尚未确定,
但到了执行函数时,fact肯定已经有了正确的赋值。
当Lua 语言展开局部函数的语法糖时,使用的并不是之前的基本函数定义。相反,形如
local function foo (params) body end
的定义会被展开成
local foo; foo = function (params) body end
因此,使用这种语法来定义递归函数不会有问题。
当然,这个技巧对于间接递归函数( indirect recursive function )是无效的。在间接递归
的情况下,必须使用与明确的前向声明( explicit forward declaration )等价的形式:

local f --“前向”声明
local function g ()
    some code
    f(n)
    some code
end
function f ()
    some code
    g(n)
    some code
end

请注意,不能在最后一个函数定义前加上local 。否则, Lua 语言会创建一个全新的局部变
量f , 从而使得先前声明的f变为未定义状态。

本文摘自《lua程序设计(第四版)》

相关文章

  • lua函数互相调用、递归调用

    在定义局部递归函数( rec ursive local function )时,由于原来的方法不适用,所以有一点是...

  • 递归调用

    什么是递归调用 递归调用就是在本函数中连续不断地对自身函数进行调用。 递归调用注意点 递归调用函数要有明确的某一或...

  • [每天进步一点点~] 递归与闭包

    1.递归 【定义】:在自己函数的内部调用自己(自己调用自己) (函数自调用) 。递归函数 简单举例?: 阶乘的递归...

  • 029_wz_hm_函数的递归

    函数的递归 函数调用自身的编程技巧成为递归 递归函数的特点 特点: 一个函数内部调用自己 函数内部可以调用其他函数...

  • Lua_API lua_call & lua_callk

    开篇 今天来简单了解一下 Lua 的函数调用:lua_call。 解析 函数调用协议 void lua_call ...

  • 单信js——4难点部分

    递归: 递归函数是指在函数内部调用函数自身。注意:递归的出口:什么情况下结束调用递归的入口:什么情况下调用自已 /...

  • 深刻理解递归———通过栈图来理解

    函数调用另外一个函数是合法的;函数调用自己也是合法的。调用自己的过程称为递归函数,这个执行过程叫做递归。 递归在数...

  • tolua调用c#函数及变量

    比如说你要调用一个lua函数 但你想把自身传给lua函数让这个函数调用c# 类的其他函数以及变量 首先是调用lua...

  • 函数递归调用

    在函数里调用自己的行为:函数递归调用 递归调用一定要有最后一次递归时的终止条件,如果没有,会导致无限调用,导致调用...

  • 递归与分治

    递归(Recursion):指函数的定义中调用函数自身的方法。 递归调用过程: 举个很好玩的栗子: 用递归调用输出...

网友评论

      本文标题:lua函数互相调用、递归调用

      本文链接:https://www.haomeiwen.com/subject/lcsxfltx.html