Java Fibonacci系列 - 数组中的返回值

时间:2013-04-06 19:28:28

标签: java arrays recursion fibonacci

我正在尝试递归计算fibonacci序列为100,使用buildArray方法将这些返回值存储到数组中,然后打印存储在数组中的值。当我尝试在main方法中打印A [N]时,我得到一个“无法解析为变量”的编译错误。我正在使用多头,因为我计算的系列高达100,虽然我不知道是否有必要使用多头。

如果我用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 个答案:

答案 0 :(得分:1)

您已在A[]范围内声明buildArray(int MAX, int N)。因此,在A[]之外无法访问buildArray。您需要将long A[]的声明移动到类变量。

此外,您实际上需要为要构造的数组运行buildArray

为了将来参考,我强烈建议使用正确的标签结构。它可以更容易地看到发生了什么。我已经编辑了您的代码(虽然必须获得批准)才能包含此代码。

答案 1 :(得分: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]);
    }
 }

答案 2 :(得分:0)

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

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

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

其他一些事情:

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

您已有权访问MAX,无需将其传递给该功能。

buildArray中的for循环效率很低,您可以在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]);
}

答案 3 :(得分: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;
}