【问题标题】:How can I optimize the following program?如何优化以下程序?
【发布时间】:2018-12-14 22:34:53
【问题描述】:

我想优化这个程序。目前我的程序运行缓慢,因为程序中的函数非常依赖于程序中的其他函数。对此进行优化的最佳方法是什么?

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);
    }
}

【问题讨论】:

  • 需要转换为循环的递归部分在哪里?我没有看到。
  • @MangoLato first call next, next call first.
  • 下一次调用时,它花费的时间比正常情况要长。所以在 next() 中调用 first() 部分需要迭代。我认为那将是首先执行。
  • 你的预期输出是什么?
  • 首先,递归严格来说是一个调用自身并且有退出条件的函数。递归本身不是一个非常推荐的方法,因为它很慢并且可以结束引发堆栈溢出异常。话虽这么说,你有一个循环调用。考虑重构你的代码。

标签: java optimization


【解决方案1】:

正如我所怀疑的,这是某种玩笑或代码高尔夫难题。该函数是一种以-11和2为首项的Fibonacci函数。

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;
}

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

【讨论】:

  • 是的,它是一个拼图代码。但它取自真实编程旧java代码的缺陷情况。我真的很困惑如何优化这种情况。
  • 嗯,上面的代码是相当优化的。如果您想更进一步,您可以研究优化斐波那契数列。但这不是一个编程谜题的网站。有一个单独的网站:codegolf.stackexchange.com.
【解决方案2】:

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) 方法中执行此操作。

【讨论】:

  • 当输入是大值时,它会减慢进程,例如:int[] testValues = { 30, 40,100 }。递归时,它在下一个方法中花费的时间最长。我想把它递归转换成迭代。
  • 请对递归有一个清晰的认识。你误解了递归。显然更大的值需要更多的迭代,这就是为什么它需要时间来执行。
  • @rghome 是的,需要修改逻辑。刚刚列出了常见的错误。
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多