将计算存储在数组中 - 第二次尝试

时间:2013-09-21 22:20:09

标签: java

我是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()。 我的问题是我无法获得computedValues [0] = 0; computedValues [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,你的解决方案有点超过我的工资等级(对不起) - 我认为我的代码中有一些错误,我需要帮助才能找到它们。谢谢。

4 个答案:

答案 0 :(得分:1)

  • 你正在递增错误的变量。

    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;

提高效率:

我想重点是比较两种方法的效率。如果没有,您应该在函数外部声明computedValuesArrayList,并在函数中根据需要添加它。这将使您仅为整个程序运行计算一次每个值。

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

答案 1 :(得分:0)

您正在将computedValues初始化为新的长

computedValues = new long[N];

我想你想这样做:

computedValues[i] = F(N);

另外,在你的循环中,你没有将i作为无限循环。将其更改为

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

答案 2 :(得分:0)

你忘记了数组中的初始数字:

long[] computedValues;
computedValues = new long[N];
computedValues[0] = 0;
computedValues[1] = 1;

答案 3 :(得分:0)

您可以使用返回arraylist的方法:

ArrayList<Long>series=new ArrayList<Long>();
for(int i=0;i<100;i++)
{
  if(i==0)series.add(new Long(0));
  if(i==1)series.add(new Long(1));
  if(i>1)series.add(new Long(series.get(i-1).longValue()+series.get(i-2).longValue()));
}

该列表将包含0,1,1,2,3,5,8,....