C# 有条件地执行函数的最佳方法是什么?

C# 有条件地执行函数的最佳方法是什么?,c#,recursion,C#,Recursion,是的,我知道措辞很难理解,但这让我很烦。在最近的一个项目中,我有一个递归的函数,有许多条件会导致它停止递归(在第三个时刻)。以下哪种情况是可选的?(即最佳性能或最容易维护) 1) 有条件回报: void myRecursingFunction (int i, int j){ if (conditionThatWouldStopRecursing) return; if (anotherConditionThatWouldStopRecursing) return; if

是的,我知道措辞很难理解,但这让我很烦。在最近的一个项目中,我有一个递归的函数,有许多条件会导致它停止递归(在第三个时刻)。以下哪种情况是可选的?(即最佳性能或最容易维护)

1) 有条件回报:

void myRecursingFunction (int i, int j){
    if (conditionThatWouldStopRecursing) return;
    if (anotherConditionThatWouldStopRecursing) return;
    if (thirdConditionThatWouldStopRecursing) return;

    doSomeCodeHere();
    myRecursingFunction(i + 1, j);
    myRecursingFunction(i, j + 1);
}
2) 用if语句将整个过程包装起来

void myRecursingFunction (int i, int j){
    if (
        !conditionThatWouldStopRecursing &&
        !anotherConditionThatWouldStopRecursing &&
        !thirdConditionThatWouldStopRecursing
    ){
        doSomeCodeHere();
        myRecursingFunction(i + 1, j);
        myRecursingFunction(i, j + 1);
    }
}

3) 你做得不对,noob,没有一个理智的算法会使用递归。

我会选择第一个解决方案,因为这使停止递归的条件非常清楚。
imho更具可读性和可维护性。

我更喜欢变体1


它比变体2更容易阅读。在这里,你必须理解3个否定,并用and把它们连在一起。我知道这并不“难”,但只要看一看变量1,就要花更长的时间,因为这两种方法都是等价的布尔表达式,所以在幕后应该会产生相同的IL代码。请注意,每个终止条件都将按照您编写它的顺序进行计算(因为编译器无法判断哪一个最有可能),因此您需要将最常见的终止条件放在第一位


尽管第二种方法更好,但我个人更喜欢将返回条件作为递归方法顶部的单独块进行编码。我发现这更容易阅读和理解(尽管我不喜欢在方法体的随机区域中返回)。

如果需要快速,我建议尽快命中最常见的情况(即,将基本情况放在末尾,因为只命中一次)。如果这会产生影响,还可以考虑在递归子句之前放置一个基本case-1(即在再次调用函数之前执行测试,而不是在进入后续调用时检查它)


而且,对于所有的事情,不要进行优化,除非这是一个问题。我首先要说清楚。

我也投票支持选项1。对我来说,这看起来更清楚。

第一个例子相当于在第二个例子中使用| | |的,所以这两个不一样。@Lasse-Huh?如果让你困惑的话,我也在否定条件句。我怀疑这会有什么不同。无论返回的顺序是什么,在递归之前都必须测试基本情况。如果是或,则是。我想到的函数有不止一个流(例如switch/case语句或嵌套的ifs)。但对于这个问题,是的,你是对的。