TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 5 / 再帰的なローカル函数を作る

-- 再帰的なローカル函数の定義
local function fact(n)
   if n == 0 then
      return 1
   else
      return n * fact(n - 1)
   end
end
print(fact(69))

-- 下のような定義の仕方では再帰呼び出しができない。
-- FACT(n - 1) をコンパイルする時点ではまだローカル函数 FACT の定義が途中であるため、存在しないグローバル函数 FACT を呼び出そうとしてしまうからである。
local FACT = function(n)
   if n == 0 then
      return 1
   else
      return n * FACT(n - 1)
   end
end
print(FACT(69))

f:id:ti-nspire:20170204125936p:plain

-- 下のように定義すれば、FACTORIAL(n - 1) をコンパイルする時点で存在しているローカル変数 FACTORIAL (値はまだ nil であるが) を参照するので問題ない。
local FACTORIAL
FACTORIAL = function(n)
   if n == 0 then
      return 1
   else
      return n * FACTORIAL(n - 1)
   end
end
print(FACTORIAL(69))

f:id:ti-nspire:20170204130247p:plain

参考: