2013-11-14 68 views
3

由于某些原因,如果else语句被执行了太多次,下面的代码会引发堆栈溢出错误。我试图让scene.targeting函数从传递参数objTable中选择一个目标,但只有具有.tgtFlag == false的目标才是有效的选择。如果函数选择一个具有.tgtFlag == true的目标,它会调用传入同一组参数的scene.targeting函数。在corona sdk递归函数中的Lua堆栈溢出

中断的行是local theTarget = params.objTable[math.random(1, #params.objTable)],但仅在调用else scene.targeting(params) end多次之后。

任何帮助将不胜感激。

function scene.targeting(params) -- Targeting functions 

    function animateTarget(target) 
    if target.savedFlag == false then 
     transition.to(target, {time = 100, y = target.y - 15}) 
     transition.to(target, {time = 100, delay = 150, y = target.y, onComplete = animateTarget} ) 
    end 
    end 

    local theTarget = params.objTable[math.random(1, #params.objTable)] 
    if theTarget.tgtFlag == false then 
    theTarget.tgtFlag = true 
    animateTarget(theTarget) 
    else 
    scene.targeting(params) 
    end 
end 

回答

4

参照Programming in Lua

A尾巴呼叫是一种跳转的穿着作为一个呼叫。当一个函数调用另一个函数作为其最后一个操作时会发生尾部调用,因此它没有其他任何操作。

在你的例子中,animateTarget显然不是以这种方式调用的,并且可能并且会受到堆栈溢出的困扰。重写它以利用TCO或将其更改为非递归版本。

+0

我不知道尾巴呼叫。伟大的小技巧不使用堆栈。 – joed4no