图路径查找中的递归函数

本文关键字:递归函数 查找 路径 | 更新日期: 2023-09-27 17:56:38

我编写了以下递归函数的脚本,以使用邻接矩阵计算从目标节点到图形中起始节点的所有可能路径。

private Stack<string> TestCaseGeneration(int TargetStateIndex, double[,] adjacancy, Stack<string> TotalResults = null, Stack<string> CarrierStack = null, int StartStateIndex = 0)
{
    Stack<string> Result = CarrierStack;
    Result.Push(TargetStateIndex.ToString() + " - ");
    if (TargetStateIndex == StartStateIndex)
    {
       TotalResults.Push(StackToSingleString(Result));
       return TotalResults;
    }
    else
    {
       List<string> neighbours = ListNeighbourLeadingToTargetNode(TargetStateIndex, adjacancy, EventIndex);
       int NumberOfNeighbours = neighbours.Count;
       if (NumberOfNeighbours != 0)
       {
           for (int i = 0; i < NumberOfNeighbours; i++)
           {
              return TestCaseGeneration(int.Parse(neighbours[i].ToString()), adjacancy, TotalResults, Result, StartStateIndex);
           }
        }
     }
     else return null;
  }

问题是return for循环,我该如何解决?

图路径查找中的递归函数

如果您不想返回任何内容,请在最后一个}之前设置return null;

如果将return null;放在 if else 语句中,编译器知道并非所有代码路径都返回值!

编辑

我现在看到你的问题对不起。

您需要创建一个变量,并在最后返回。在 if 语句中,您可以编辑变量。

如果从未编辑过变量,则返回变量的默认值!

认为你的代码将始终返回一个值。我建议你在方法的最后一个 } 之前抛出一个异常:它将编译,你有一个很好的机会看到你的代码在运行!如果它引发异常,您知道它何时不会返回值。

正如已经指出的那样,您的 else 语句没有任何作用。考虑用通俗的术语来布置你的方法:

method(){
    if(something){
        // do stuff
        return value
    }
    else{
     // do something else but,
     // never do anything with this information
    }
    return null
}

这基本上就是您的方法分解时的样子。else 语句做了一些事情,但这些东西永远不会在任何地方使用。

假设在 else 语句中,您调用递归函数,该函数递归调用 1000 多次。在此循环结束时,它将返回 null 或某个值返回给 else 语句。

然后,该 else 语句对返回值不执行任何操作,然后返回 null。

该递归调用基本上是无用的,除非它也被返回。

考虑尝试:

private Stack<string> TestCaseGeneration(int TargetStateIndex, double[,] adjacancy, Stack<string> TotalResults = null, Stack<string> CarrierStack = null, int StartStateIndex = 0)
{
    Stack<string> Result = CarrierStack;
    Result.Push(TargetStateIndex.ToString() + " - ");
    if (TargetStateIndex == StartStateIndex)
    {
       TotalResults.Push(StackToSingleString(Result));
       return TotalResults;
    }
    else
    {
       int NumberOfNeighbours = ListNeighbourLeadingToTargetNode(TargetStateIndex, adjacancy, EventIndex).Count;
       if (NumberOfNeighbours != 0)
       {
           for (int i = 0; i < NumberOfNeighbours; i++)
           {
           return TestCaseGeneration(i, adjacancy, TotalResults, Result, StartStateIndex);
           }
        }
     }
     return null;
  }

请注意,我在 else 语句中的递归调用中添加了一个 return 语句。