我是Java的新手,目前正在尝试学习如何最好地将数字存储在数组中。

我正在研究的特定问题试图通过将计算存储在数组中来找到一种更好地实现以下方法的方法。

代码如下:

public static long myF(int N) {
  long[] computedValues;
  computedValues = new long[N+1];
  computedValues[0] = 0;
  computedValues[1] = 1;
    for (int i = 2; i < computedValues.length ;i++){
        computedValues[i] = computedValues[(i-1)]+computedValues[(i-2)];
        System.out.println("array["+(i)+"] = "+computedValues[i]);
    }
        return computedValues[N-1];
    }
    public static void runMyF() {
       for (int N = 0; N < 100; N++)
          StdOut.println(N + " " + myF(N));
    }


    public static void main(String[] args) {
        runMyF ();
    }


此代码中的main应该调用runMyF(),然后runMyF()应该调用myF()。
我的问题是我无法获得computeValues [0] = 0;计算值[1] = 1;输出中包含的第二个问题是,即当runMyF()调用myF()时得到此错误消息:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at algs11.MyFib.myF(MyFib.java:21)
at algs11.MyFib.runMyF(MyFib.java:30)
at algs11.MyFib.main(MyFib.java:37)


有什么帮助吗?
@Dukeling,您的解决方案有点超出我的薪水等级(对不起)-我认为我的代码中存在一些错误,需要我帮助找到它们。谢谢。

最佳答案

您正在递增错误的变量。

for (int i = 2; i < computedValues.length; N++){


应该

for (int i = 2; i < computedValues.length; i++){


请注意N++更改为i++
记住要初始化computedValues[0]computedValues[1]。这应该出现在循环之前:

computedValues[0] = 0;
if (N > 0) // needed because when N = 0, the below will be out of bounds
  computedValues[1] = 1;

它可能应该是computedValues = new long[N+1];,否则数组太小。
您需要返回正确的值-将return computedValues[N];更改为return 0;


附加效率:

我猜想重点是比较两种方法的效率。如果不是,则应在函数外部将computedValues声明为ArrayList,然后在函数中根据需要将其添加。这将导致您在整个程序运行中仅计算一次每个值。

static ArrayList<Long> computedValues = new ArrayList<Long>(Arrays.asList(0l,1l));

public static long myF(int N) {
    for (int i = computedValues.size(); i <= N; i++){
         computedValues.add(computedValues.get(i-1) + computedValues.get(i-2));
         System.out.println("array[" + i + "] = " + computedValues.get(i));
    }
    return computedValues.get(N);
}

关于java - 将计算存储在数组中-第二次尝试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18938263/

10-09 06:26