0

我是 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; 计算值[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

4 回答 4

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

附加效率:

我想重点是比较两种方法的效率。如果没有,您应该computedValues在函数外部声明为 an 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);
}
于 2013-09-21T22:34:44.267 回答
0

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

computedValues = new long[N];

我想你想这样做:

computedValues[i] = F(N);

此外,在您的循环中,您并没有强化 i ,这使其成为无限循环。将其更改为

for (int i = 2; i < computedValues.length ;i++)
于 2013-09-21T22:23:40.330 回答
0

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

long[] computedValues;
computedValues = new long[N];
computedValues[0] = 0;
computedValues[1] = 1;
于 2013-09-21T22:27:46.353 回答
0

您可以使用返回数组列表的方法:

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,....

于 2013-09-21T22:28:04.527 回答