当前位置: 首页 > 知识库问答 >
问题:

是否有任何方法来检测返回类型为falseflood_fill递归方法的结束?

董翰墨
2023-03-14

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

因此,每次在游戏对象中调用FloodFill()函数时,它都会改变自己的颜色,如果相邻的瓷砖在一定的条件范围内,它就会激活这些相邻的瓷砖FloodFill()函数。

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

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

我试图通过将FloodIt()的返回类型更改为bool,并将StartFloodIt()函数(启动整个递归级联的函数)更改为协同程序来解决这个问题。然后我就用这个变成了yeild的条件:

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个答案

卞俊贤
2023-03-14

由于WaitTill接受委托作为参数,但您传递的是从FloodFill返回的bool,因此您应该能够通过调用WaitTill来修复错误,比如:

yield return new WaitUntil(() => gms.FloodFill(0, 0, GetComponent<Image>().color, gms.tilesColorArray[0, 0]));
 类似资料:
  • 我想创建一个任务来运行串行命令。此时,我不需要从正在进行工作的方法返回任何内容。这可能会在以后发生变化,但我现在很好奇这是如何发生的。 这就是我所拥有的。我想为任务使用单独的方法,而不是创建匿名操作。我尝试返回void,结果是“void不能显式转换为任务”。我也试过了<代码>任务 在此过程中,我使用了一个线程来完成这项任务,但这次我想使用任务。 预计到达时间: 最后,这是我的完整解决方案

  • 所以我明白了如何使用一个递归方法,它有一些其他的返回类型,而不是作废。通常我会在同一个方法中再次调用相同的方法(在递归的情况下),同时在调用中递减或增加一些值以达到基本情况。然后在某个时候达到基本情况,问题就解决了,所以它开始返回每个调用的值。沿着这些路线。 但是 如果该方法的返回类型为void,那么您不能调用该方法,因为它不会/不能返回任何内容,该怎么办?我试着倒着写一个句子,我已经用for循环

  • 我有一个,它存储了一个名为的超类的实例。用户可以将这个类的不同子类放入映射中。映射的键是相应模型的(即),它们也作为实例变量存储在对象中。随后可以通过getter检索实例,该getter使用泛型并将强制转换为所需的子类型。 要检索DAO,您只需执行以下操作: 这工作得很好,但是现在我想要一个检查,当存储的DAO中的模型类不等于时抛出一个异常。即。以下操作在执行时应引发异常: 如前所述,类型也存储在

  • 问题内容: 测试(使用反射)最简单的方法是,给定方法(即java.lang.Method实例)是否具有返回类型,可以安全地强制转换为List ? 考虑以下代码段: 所有方法1、2、3均满足要求。对于method1进行测试非常容易(通过getGenericReturnType(),该方法返回ParameterizedType的实例),但是对于method2和3来说,并不是那么明显。我想通过遍历所有g

  • 问题内容: 为什么以下代码会编译?该方法返回该类型或其子类的实例。类中的代码调用该方法。编译器允许将返回值存储到类型的变量(显然不在的层次结构中)。 即使在擦除类型之后, 返回类型也不应该仍然是的实例 吗? 该方法的字节码为: 编辑:一致地替换为。 问题答案: 这实际上是合法的类型推断*。 我们可以将其简化为以下示例(Ideone): 因为是接口,所以允许编译器推断(无意义的,实际上是)交集类型。

  • 我有一个实用函数,它从您的数组中返回一个值。但是,您的数组显然可以包含任何类型的元素,那么如何记录返回类型是混合的呢? 在PHPdoc中,我将使用: JSDoc等价物是什么?