1

我正在尝试将斐波那契数列递归计算为 100,使用 buildArray 方法将这些返回值存储到数组中,然后打印存储在数组中的值。当我尝试在 main 方法中打印 A[N] 时,出现“无法解析为变量”编译错误。我正在使用 longs,因为我正在计算最多 100 个系列,尽管我不知道是否有必要使用 longs。

如果我用 F(N) 代替 A[N] 代码可以工作,但我需要将值放入一个数组并打印该数组。此代码甚至将值存储在数组中吗?我刚开始java,谢谢。

public class MyFibonacci {
    public static final int MAX = 100;

    public static long[] buildArray(int MAX, int N) {
        long[] A = new long[MAX];

        A[0] = 0;
        A[1] = 1;

        for(N = 2; N < MAX; N++)
            A[N] = F(N);
        return A;
    }

    public static long F(int N) {
        if(N == 0)
            return 0;
        if(N == 1)
            return 1;
        return F(N - 1) + F(N - 2);
    }

    public static void main(String[] args) {
        for(int N = 0; N < MAX; N++)
            System.out.println(N + " " + A[N]);
    }
}
4

4 回答 4

1

您已声明A[]buildArray(int MAX, int N). 因此,A[]buildArray. 您需要将声明移至long A[] 类变量。

此外,您实际上需要运行buildArray才能构建数组。

为了将来参考,我强烈建议使用适当的标签结构。它使查看正在发生的事情变得更加容易。我已经编辑了您的代码(尽管它必须被批准)以包含它。

于 2013-04-06T19:32:13.560 回答
1

我认为这是您需要的代码:

public class MyFibonacci{

    public static final int MAX = 100;
    long[] A = new long[MAX];
    public static long[] buildArray(int N){
    A[0] = 0;
    A[1] = 1;

    for (N = 2; N < MAX; N++){
        A[N] = F(N);
        }
    return A;
    }

    public static long F(int N)
    {
   if (N == 0) return 0;
   if (N == 1) return 1;
   return F(N-1) + F(N-2);
    }


    public static void main(String[] args)
    {
    buildArray(<some number - not sure where you get it from? N by the way in buildArray()>);
   for (int N = 0; N < MAX; N++)
      StdOut.println(N + " " + A[N]);
    }
 }
于 2013-04-06T19:37:00.357 回答
0

主要问题是您永远不会调用该buildArray函数。

要使您的代码正常工作,您只需将其添加到main

long[] A = buildArray(MAX, 0);

其他一些事情:

您可以删除参数N并在函数中声明它(或将其全部删除,见下文)。

您已经可以访问MAX,无需将其传递给函数。

for-loop inbuildArray效率比较低,可以在里面设置数组F

鉴于以下情况,A作为类变量比传递它更干净。

最后,代码:

static int MAX = 100;
static long[] A;
public static void buildArray()
{
  A = new long[MAX+1];
  F(MAX);
}

public static long F(int N)
{
  long val;
  if (N < 2)
    val = N;
  else if (A[N] != 0) // HEY! It's already calculated! Awesome! Just return it.
    return A[N];
  else
    val = F(N-1) + F(N-2);
  A[N] = val;
  return val;
}
public static void main(String[] args)
{
  buildArray();
  for (int N = 0; N <= MAX; N++)
    System.out.println(N + " " + A[N]);
}
于 2013-04-06T19:35:54.257 回答
0

由于您可以分配数组内存,因此在计算期间使用它是很有意义的。考虑这种方法:

public static long[] f_a(int n) {
    long[] a = new long[n];
    a[1] = 1;
    for (int i = 2; i < n; i++)
        a[i] = a[i-1] + a[i-2];
    return a;
}
于 2014-11-01T01:15:59.113 回答