我正在尝试递归计算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]);
}
}
答案 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;
}