实现此算法的最佳方法是什么?

时间:2011-04-06 13:35:12

标签: algorithm optimization

编写如下算法的最佳方法是什么:

if (a) {
  doA();
  done();
}
else if (b) {
  doB();
  done();
}
else if (c) {
  doC();
  done();
}

我想到的另一种方法:

done = true;
if (a) {
  doA();
}
else if (b) {
  doB();
}
else if (c) {
  doC();
}
else {
  done = false;
}
if (done) {
  done();
}

哪个更好?还有另一种最好的方法吗?

6 个答案:

答案 0 :(得分:3)

没有任何背景,对我来说最自然的方式是:

bool do_it(int condition)
{
    switch (condition)
    {
        case a: doA(); return true;
        case b: doB(); return true;
        case c: doC(); return true;
        default: return false;
    }
}

// ...

if (do_it) done();

因为它抽象了“如果整个事情成功,那么请调用done()”的逻辑。

但还有很多其他方法可以做到这一点。特别是,如果将来可能会增加条件的数量,我根本不会这样做。

答案 1 :(得分:1)

取决于您使用的条件/操作数量以及您正在使用的语言类型。

OOP和polymorphysm可以很好地工作。

答案 2 :(得分:0)

使用switch语句,沿途设置isDone标志,并根据标志调用done()。

答案 3 :(得分:0)

如果a,b和c是不同的复杂条件表达式,那么你的第一个解决方案是最好的。如果此代码在函数内部,也许你可以避免使用“else if”元素,例如:

private void doit() {
    if (a) {
        doA();
        done();
        return;
    }
    if (b) {
        doB();
        done();
        return;
    }
    if (c) {
        doC();
        done();
        return;
    }
}

所以对我而言,它更像是一个代码风格的问题。

答案 4 :(得分:0)

我会把它写成

var failed = false;
if (a) doA();
else if (b) doB();
else if (c) doC();
else failed = true;
if (!failed) done();

我不喜欢首先将done这样的变量设置为true然后撤消它,因为在条件启动之前没有完成工作,所以它看起来不合逻辑。

我也不喜欢switch case选项,因为条件'a','b','c'不一定是互斥的; if ... else if ... else cascade支持非独占条件,但switch()可能不依赖于语言。例如。你不能转换级联if ... else来切换C ++。

我认为将多个呼叫点移除到done()是非常重要的,因为这是冗余,如果完成,则后来出现维护问题(例如,得到参数。

答案 5 :(得分:0)

首先,有一个条件变量,而不是三个。其次,我使用函数指针的映射,条件变量作为键。这是一个例子:

#!/usr/bin/env python

def doA():
    pass
def doB():
    pass
def doC():
    pass
def done():
    pass

a = 3
b = 6
c = 8

doers = {}
doers[a] = doA
doers[b] = doB
doers[c] = doC
condition = a

# this is now the entire "algorithm":

if condition in doers:
    doers[condition]()
    done()