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

时间:2009-09-17 20:49:24

标签: c# recursion

是的,我知道措辞很难理解,但这会让我感到很烦恼。在最近的一个项目中,我有一个recurses函数,并且有许多条件会导致它停止递归(目前为三)。哪种情况可选? (I.E.最佳表现或最简单的维护)。

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,没有理智的算法会使用递归。

5 个答案:

答案 0 :(得分:6)

这两种方法都应该在幕后产生相同的IL代码,因为它们是等效的布尔表达式。请注意,每个终止条件将按您编写的顺序进行评估(因为编译器无法确定哪个最有可能),因此您需要首先放置最常见的终止条件。

即使structured programming指示第二种方法更好,但我个人更喜欢将返回条件编码为递归方法顶部的单独块。我发现更容易阅读和遵循(尽管我不喜欢方法体随机区域的回报)。

答案 1 :(得分:3)

我会选择第一个解决方案,因为这样可以非常清楚停止递归的条件是什么。 它具有更高的可读性和可维护性。

答案 2 :(得分:3)

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

并且,尽管如此,除非是问题,否则不要进行优化。我先说清楚。

答案 3 :(得分:1)

我更喜欢变体1 ......

阅读变体2要容易得多。在这里你必须理解3个否定并将它们与和它们连在一起。我知道它不是“硬”,但它需要更长的时间,然后再看一下变体1

答案 4 :(得分:0)

我的投票也是选项#1。它看起来更清晰。