Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在递归算法中,并非所有代码路径都返回值_C# - Fatal编程技术网

C# 在递归算法中,并非所有代码路径都返回值

C# 在递归算法中,并非所有代码路径都返回值,c#,C#,我刚刚设计了一个递归算法,并在C#Encounting中实现,并不是所有的代码路径都返回一个值错误。代码如下: public List<List<Event>> CollectPaths(IEnumerable<string[]> transitions, State q_r, State q_s, List<State> Q_T, ref List<Event> tempPath) { if (

我刚刚设计了一个递归算法,并在C#Encounting
中实现,并不是所有的代码路径都返回一个值
错误。代码如下:

public List<List<Event>> CollectPaths(IEnumerable<string[]> transitions, State q_r, State q_s, List<State> Q_T, ref List<Event> tempPath)
        {
            if (!Q_T.Any())
            {
                pathCollection.Add(tempPath);
                return pathCollection;
            }

            else
            {
                List<State> Q_O = new List<State>();
                Q_O = Get_Q_O(q_r, transitions);

                State qq = new State("");

                foreach (State q in Q_O)
                {
                    List<Event> S_O = new List<Event>();
                    List<Event> S_OO = new List<Event>();
                    S_O = Get_S_O(q_r, q, transitions);
                    S_OO = Get_S_OO(q_r, q, S_O, transitions);

                    if (q.ID == q_s.ID)
                    {
                        tempPath.AddRange(S_O);
                        pathCollection.Add(tempPath);
                        Q_T.Remove(q);
                        if (!Q_T.Any())
                            return pathCollection;
                        else
                            continue; /////////////Note 1
                    }

                    else 
                    {
                        foreach(Event sigma in S_O)
                        {
                            if (AFC_1(S_OO) ||
                             AFC_2(S_OO) ||
                             (AFC_3_1(S_OO, S_O) && AFC_3_2(GetC_S_OO(S_OO), GetU_S_OO(S_OO)))
                            )
                            {
                                tempPath.AddRange(S_O);
                                Q_T.Remove(q);
                                CollectPaths(transitions, q, q_s, Q_T, ref tempPath);
                            }

                            else
                            {
                                Q_T.Remove(q);
                                if (!Q_T.Any())
                                    return pathCollection;
                                else
                                    continue; /////////////Note 2
                            }
                        }
                    }
                }
            }
        }
public List collectPath(IEnumerable transitions、State q\u r、State q\u s、List q\u T、ref List tempPath)
{
如果(!Q_T.Any())
{
pathCollection.Add(tempPath);
返回路径集合;
}
其他的
{
列表Q_O=新列表();
Q_O=Get_Q_O(Q_r,转换);
状态qq=新状态(“”);
foreach(q_O中的状态q)
{
列表S_O=新列表();
列表S_OO=新列表();
S_O=获取S_O(q_r,q,转换);
S_OO=获取S_OO(q_r,q,S_O,转换);
如果(q.ID==q_.ID)
{
tempPath.AddRange(S_O);
pathCollection.Add(tempPath);
Q_T.移除(Q);
如果(!Q_T.Any())
返回路径集合;
其他的
继续;//注意1
}
其他的
{
foreach(S_O中的事件西格玛)
{
如果(AFC_1(S_OO)||
AFC_2(S_OO)||
(AFC_3_1(S_OO,S_O)和AFC_3_2(GetC_S_OO(S_OO),GetU_S_OO(S_OO)))
)
{
tempPath.AddRange(S_O);
Q_T.移除(Q);
收集路径(转换、q、q_s、q_T、ref tempPath);
}
其他的
{
Q_T.移除(Q);
如果(!Q_T.Any())
返回路径集合;
其他的
继续;//注意2
}
}
}
}
}
}
有许多条件分支,我已经尽了最大努力使算法最终返回
pathCollection

一些评论:

注释1
注释2
:对于
q
的其他值,
continue
继续
foreach
。然后,它将去掉
if
并执行
else
;或者
Q_T
(一个全局变量,可以通过函数的所有实例化进行更改)将变为空并且
pathCollection
返回

但是我不知道这个代码出了什么问题


你能给我一些建议吗

如果您确信函数将安全返回值,只需在最后一个括号上方添加一个return语句即可


但是,我建议您尝试重构代码以捕获此类内容(添加异常等),以确保这个非常混乱的算法能够正确运行

要回答这个问题,我们需要问自己:函数的每个可能分支都会返回一个值吗?根据编译器,for循环不一定会命中if语句。@EastonBornemeier:是的。我已经计划好了处理,但似乎有一个我找不到的缺陷。我不认为问题在于你是否保护了它会命中if语句的事实,而是解释器看到了这一点,看到返回在if语句中,而不是在else语句中,因此,它可能不会返回值。编译器不知道您将始终到达
return
语句。(我也不知道。)只需在函数底部添加某种类型的
return
(或抛出异常)。如果
Q_O
为空,您希望发生什么?不,不要添加return语句。否则,如果你到达那里,它将返回一些毫无意义的东西。如果它不应该到达那里,那么抛出一个异常来指示它。这样,在异常情况下,它确实到达了那里,您会得到一个异常,并立即被告知您的逻辑有问题。如果你还了什么东西。。。那么,你会返回什么有意义的东西呢?这就是我所说的重构来抓住这种东西的意思。添加返回声明的做法非常糟糕,我同意,返回没有任何意义,我只是添加了问题的直接解决方案。编辑我的答案以修复我的冗余。您只需返回null。。。null不是胡说八道。Null表示没有满足算法要求的路径。或者你可以抛出一个例外。如果这就是你所说的重构,那么我仍然不同意你的回答。您在第一段中说了“添加返回声明”,然后您的第二段似乎在说“现在删除返回声明以支持例外”。为什么不首先建议例外?