【问题标题】:Java Fibonacci Series - Return Values in ArrayJava 斐波那契数列 - 数组中的返回值
【发布时间】:2013-03-29 02:49:52
【问题描述】:

我正在尝试将斐波那契数列递归计算为 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]);
    }
}

【问题讨论】:

  • 只是一个提示:1. java 字段应该以小写字母开头,只要它们不是 final 和 2. 斐波那契数列不是以 1 开头吗?设置A[0]=1if(N==0)return 1; :)

标签: java arrays recursion fibonacci


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    主要问题是您从不调用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]);
    }
    

    【讨论】:

    • 为什么去掉buildArray中的for循环就可以了?您不必遍历 F(N) 值的范围 (0,MAX) 吗?谢谢。
    • @MC9 因为在计算F(n)的过程中,你还要计算F(n-1), F(n-2), F(n-3), ..., F (0) 因为递归调用。因此,只需计算 F(MAX) 并随时存储这些中间值。
    • 谢谢,这很棒。我将削减我的原始代码,看看我是否可以让它以另一种方式工作,但这很棒。
    【解决方案3】:

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

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

    【讨论】:

    • 我添加了 long[] A = buildArray();但我收到的错误消息是“找不到或加载主类”。我认为 buildArray() 没有收到任何传递的值。有任何想法吗?非常感谢您的帮助。
    • 你把这个准确地放在哪里了?
    • 我把它放在你在代码中建议的同一行。另外,请注意,我在 for 循环的 buildArray 方法中声明了 int N,而不是传入值 int N。不过,我认为这不是我的问题。
    • 我看你只是说“long[] A = buildArray();”...是你放在什么地方的吗?
    • 是的...所以我的主要方法是: public static void main(String[] args) { long[] A = buildArray(); for(int N = 0; N
    【解决方案4】:

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

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

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

    【讨论】:

    • 还需要实际执行:main方法中的“buildArray”
    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 2019-04-06
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多