如何优化以下程序?

时间:2018-12-14 03:53:45

标签: java optimization

我想优化该程序。当前,我的程序运行缓慢,因为程序中的功能很大程度上取决于程序中的其他功能。对此进行优化的最佳方法是什么?

public class MyClass {

    public static void main(String args[]) {
        int[] testValues = {3, 5, 10};
        for (int i = 0; i < testValues.length; ++i) {
            System.out.println(first(testValues[i]));
        }
    }

    public static int first(int a) {
        int b;
        if (a <= 1) {
            if (a == 1) {
                b = convertOne(a);
            } else {
                b = convertTwo(a - 1);
            }
        } else {
            return next(a);
        }
        return b;
    }

    public static int convertOne(int c) {
        return++c;
    }

    public static int convertTwo(int d) {
        int i = 1;
        for (i = d * 11; i > d; i--) {
            i--;
        }
        return i;
    }

    public static int next(int e) {
        int container = first(e - 1);
        return container + first(e - 2);
    }
}

2 个答案:

答案 0 :(得分:0)

我怀疑这是个玩笑或打高尔夫球的难题。该函数是一种斐波那契函数,以-11和2为第一项。

first方法重构为:

public static int first(int a) {

    if (a <= 0) {
        return (a - 1) * 11;
    }
    if (a == 1) {
        return 2;
    }

    int n0 = -11;
    int n1 = 2;
    for (int i = 2; i <= a; i++) {
        int t = n0 + n1;
        n0 = n1;
        n1 = t;
    }
    return n1;
}

其余所有都是垃圾,或更可能是故意混淆。

答案 1 :(得分:-1)

1)一条黄金法则是:尽量避免嵌套

if (a <= 1) {
        if (a == 1) {
            b = convertOne(a);
        } else {
            b = convertTwo(a - 1);
        }
    } else {
        return next(a);
    }

2)如果i--循环中的i-=2一样使用过两次,则您使用了两次。

public static int convertTwo(int d) {
    int i = 1;
    for (i = d * 11; i > d; i--) {
        i--;
    }
    return i;
}

3)以下代码执行的逻辑不足。

if (a <= 1) {
        if (a == 1) {
            b = convertOne(a);
        } else {
            b = convertTwo(a - 1);
        }// this else is executing for cases < 1, but logic of "convertTwo(a - 1)" is ambiguous, try dry running it for -1 
    } else {
        return next(a);
    }

4)以下代码的逻辑也不必起作用

public static int convertOne(int c) {
    return ++c;
}

5)函数用于执行单个可重复使用的操作。在next(int e)函数中,您没有执行 single 。使用 first(int a)方法执行此操作。