深学習LUAの第2の機能

深機能2

非グローバル関数

  1. 最初の値は関数であり、関数はグローバル変数、ローカル変数、テーブルのフィールドに格納することができます
  2. フィールドに保存されているほとんどのLuaのライブラリ関数テーブル
Lib = {}
Lib.foo = function (x, y)
    return x + y
end
Lib.goo = function (x, y)
    return x - y
end
Lib = {
    foo = function (x, y) return x + y end,
    goo = function (x, y) return x - y end
}
Lib = {}
function Lib.foo(x, y) return x + y end
fucntion Lib.goo(x, y) return x - y end
  1. ローカル変数に格納されている機能、すなわち「部分的機能」
  2. この機能は、「パッケージ」のために対応するスコープを使用することができpackage便利です
  3. プロセスAの関数として各ブロックLUA
  4. 関数は、プログラムブロック内で宣言ブロックのみに見える、ローカル関数であります
  5. 他の機能を確保する字句ドメインは、これらの地域の機能をパッケージ化するために使用することができます。
local f = function (<参数列表>)
    <函数体>
end

local g = function (<参数列表>)
    <函数代码>
    f(实参) -- 可以调用 f
    <函数代码>
end

local function f(<参数列表>)
    <函数体>
end

-- 阶乘 n! = n * (n - 1) * (n - 2) * ... 1
local fact = function (n) -- 错误的递归函数定义
    if n == 0 then 
        return 1
    else
        return n * fact(n - 1) -- fact 函数定义未完成,调用的是 fact 全局变量,而不是 fact 函数本身
    end
end
    
-- 正确的递归函数定义
local fact
fact = function (n)
    if n == 0 then
        return 1
    else
        return n * fact(n - 1)
    end
end

local function foo(<参数>) <函数体> end
-- Lua 将其展开为:
local foo
foo = function (<参数>) <函数体> end
-- 正确的函数定义,对于间接递归无效
local function fact (n)
    if n == 0 then
        return 1
    else
        return n * fact(n - 1)
    end
end
-- 递归就是函数调用函数本身
-- 间接递归就是 a 函数调用 b 函数而 b 函数又调用了 a 函数
-- 间接递归需要使用明确的前向声明
local f, g
function g ()
    <函数代码>
    f()
    <函数代码>
end

function f() -- 不要加 local 如果加上那么在函数 g 中引用的就处于未定义状态,因为 lua 会创建一个全新的局部变量 f
    <函数代码>
    g()
    <函数代码>
end

右末尾再帰

  1. 「ラストコール」は似ているgoto関数の呼び出し
  2. 呼び出しは「末尾再帰」である場合、関数呼び出しは、他の関数の最後のアクションである場合には
function f (x)
    <函数代码>
    return g(x)
end
  1. Fコールgが終了した後、他のコードの実行は存在しません
  2. この場合、プログラムは「末尾再帰」機能に戻す必要はありません。
  3. 「ラストコール」のプログラムの後には、スタックの機能についての情報を保存する必要はありません
  4. グラム・リターンは、ときに実行制御が呼び出しFの点に直接返すことができます
  5. ので、任意の時間を費やすことはありませんスタックスペース「ラストコール」メイキング
  6. この実装は、「末尾呼び出しの削除」と呼ばれています。
-- 尾调用函数
function foo(n)
    if n > 0 then
        return foo(n - 1)
    end
end
-- 调用完 g 函数后还进行了加法操作,非尾调用
return g(x) + 1 
-- 有 or 操作,必须调整为一个返回值
retrun x or g(x) 
-- 函数外嵌套一个括号,强制其只返回一个返回值
return (g(x))
-- 尾调用标准格式
return <func>(<args>)
-- 是一个尾调用
-- 调用前会对 <func> 及其参数求值
return x[i].foo(x[j] + a * b, i + j)

書き込みステートマシン

  1. 典型的な例:迷路
-- 四间房间的迷宫
function room1()
    local move = io.read()
    if move == "south" then
        return room3()
    elseif move == "east" then
        return room2()
    else
        print("invalid move")
        return room1()
    end
end

function room2()
    local move = io.read()
    if move == "south" then
        return room4()
    elseif move == "west" then
        return room1()
    else
        print("invalid move")
        return room2()
    end
end

function room3()
    local move = io.read()
    if move == "north" then
        return room1()
    elseif move == "east" then
        return room4()
    else
        print("invalid move")
        return room3()
    end
end

function room4()
    print("congratulations!")
end
  1. 何も存在しない場合は、「末尾呼び出しの削除は、」ユーザーが移動し、新たな層スタックを作成するたびに、いくつかのステップの後に、スタックオーバーフローかもしれ
  2. 任意の制限なしに、より頻繁にモバイルユーザー「を排除するための最後の呼び出し」
  3. すべての動きは、実際には完成されているのでgoto、別の関数に文を

おすすめ

転載: www.cnblogs.com/door-leaf/p/12369006.html