有什么方法可以检测返回类型为void的Flood_fill递归方法的结尾吗?

时间:2019-10-31 09:12:25

标签: c# unity3d recursion

正如问题所建议,我实现了一个返回类型为“ void”的递归函数(该函数类似于游戏“ Flood it!”,这是游戏https://unixpapa.com/floodit/的链接)。

因此,每次在GameObject中调用函数FloodFill()时,它都会更改其自身的颜色,并且,如果与其相邻的瓦片在一定范围内,则会激活这些相邻的瓦片FloodFill()函数。

问题是,我想在递归方法完成后激活其他函数,但是由于返回类型为void,所以我不知道它何时结束,并且它类似于“过程”而不是递归方法的“功能”,“钩子”(递归结束和返回的条件)或多或少是模糊的。

在大多数情况下,您可以通过再次检查“挂钩”来检查递归是否完成。如果顶层递归调用(递归函数的第一个调用)的条件成立,则递归完成。

我试图通过将FloodIt()的返回类型更改为bool并将StartFloodIt()(启动整个递归级联的函数)更改为协程来解决该问题。 然后我用它变成了屈服状态:

yeild return new WaitUntil(() => FloodIt());

这是StartFloodFill()函数:

IEnumerator StartFloodFill()
{
    DisableButtons();
    var a = false;
    a = gms.FloodFill(0, 0, GetComponent<Image>().color, gms.tilesColorArray[0, 0]);
    yield return new WaitUntil(a);
    EnableButttons();
}

这是递归的FloodFill()函数:

public bool FloodFill(int x, int y, Color targetColor, Color prevColor) 
{
    if (x < 0 || x >= totalRows || y < 0 || y >= totalRows || tilesColorArray[x, y] != prevColor) // the "hook" condition
    {
        return true;
    }

    tilesColorArray[x, y] = targetColor;

    //calling recursively to adjacent tile
    FloodFill(x, y - 1, targetColor, prevColor);
    FloodFill(x, y + 1, targetColor, prevColor);
    FloodFill(x - 1, y, targetColor, prevColor);
    FloodFill(x + 1, y, targetColor, prevColor);

    return true;
}

系统返回错误

  

“无法从'bool'转换为System.Func“

因此,它表明这种方法或多或少都失败了。 关于其他解决方案有什么想法吗?还是上述代码片段的修复程序?

如果您需要更多信息,请在评论部分询问我。

1 个答案:

答案 0 :(得分:0)

由于WaitUntil接受委托作为参数,但是您传递的是bool返回的FloodFill,因此您应该能够通过调用{{1}来解决错误}:

WaitUntil