是的,我知道措辞很难理解,但这会让我感到很烦恼。在最近的一个项目中,我有一个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,没有理智的算法会使用递归。
答案 0 :(得分:6)
这两种方法都应该在幕后产生相同的IL代码,因为它们是等效的布尔表达式。请注意,每个终止条件将按您编写的顺序进行评估(因为编译器无法确定哪个最有可能),因此您需要首先放置最常见的终止条件。
即使structured programming指示第二种方法更好,但我个人更喜欢将返回条件编码为递归方法顶部的单独块。我发现更容易阅读和遵循(尽管我不喜欢方法体随机区域的回报)。
答案 1 :(得分:3)
我会选择第一个解决方案,因为这样可以非常清楚停止递归的条件是什么。 它具有更高的可读性和可维护性。
答案 2 :(得分:3)
如果需要快速的话,我建议尽快点击最常见的情况(即将基础案例放在最后,因为你只会打一次)。还要考虑在递归子句之前放置一个基本case-1(即在再次调用函数之前执行测试,而不是在进入后续调用时检查它),如果这会产生影响。
并且,尽管如此,除非是问题,否则不要进行优化。我先说清楚。
答案 3 :(得分:1)
我更喜欢变体1 ......
阅读变体2要容易得多。在这里你必须理解3个否定并将它们与和它们连在一起。我知道它不是“硬”,但它需要更长的时间,然后再看一下变体1
答案 4 :(得分:0)
我的投票也是选项#1。它看起来更清晰。