图路径查找中的递归函数
本文关键字:递归函数 查找 路径 | 更新日期: 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 语句。