图路径查找中的递归函数

时间:2015-06-16 15:12:48

标签: c# recursion path

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

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;
  }

问题是returnfor循环中,我该如何解决?

3 个答案:

答案 0 :(得分:0)

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

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

修改

我现在看到你的问题很抱歉。

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

如果永远不会编辑变量,则返回变量的默认值!

答案 1 :(得分:0)

认为您的代码将始终返回一个值。我建议你在方法的最后一个之前抛出异常:它会编译,你很有可能看到你的代码在行动!如果它抛出异常,你知道什么时候不会返回一个值。

答案 2 :(得分:0)

正如已经指出的那样,你的其他声明什么也没做。考虑以外行人的方式阐述你的方法:

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语句。