java - 减少到三元素数组后,斐波那契迭代错误中长度为 3 的索引 3 超出范围
问题描述
我有一个任务,我应该使用循环和数组创建斐波那契迭代。如何检查 fibonacciNumberInOrder 的负值?我的导师告诉我,我不需要在数组中分配 N 个元素。我可以将其减少为 3element 数组。我应该将这个数组指向最后三个斐波那契数。现在我收到一个错误:Index 3 out of bounds for length 3。我想这是因为我改变了这个:
long [] fibonacci = new long [fibonacciNumberInOrder];
至:
long [] fibonacci = new long [] {1,1,2};
我应该怎么做才能让它发挥作用并保持导师的要求?
public class FibonacciIterative {
public static void main(String[] args) {
int fibonacciNumberInOrder = 5;
fibonacci(fibonacciNumberInOrder);
}
public static long[] fibonacci(int fibonacciNumberInOrder) {
long [] fibonacci = new long [] {1,1,2};
for (int i = 2; i < fibonacciNumberInOrder; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
System.out.print(Arrays.toString(fibonacci) + ", ");
}
return fibonacci;
}
}
解决方案
问题是您试图将所有元素存储在Array
. 但是,由于您Array
的大小只有 3,因此您很快就会尝试访问超出范围的索引。你的导师说得对,你只需要三个名额。一旦空间不足,您可以移动元素并覆盖以前的条目。(您只需要序列中的前两个数字,然后中的第三个位置Array
将是前两个数字的总和)
所以它会像这样:
迭代:
[1, 1, 2]
[1, 2, 3]
[2, 3, 5]
[3, 5, 8]
等等。为此,您可以使用简单的 for 循环将每个元素左移一个:
public static long[] fibonacci(int fibonacciNumberInOrder) {
long [] fibonacci = new long [] {1,1,2};
for (int i = 0; i < fibonacciNumberInOrder; i++) {
System.out.print(Arrays.toString(fibonacci) + ", ");
for(int j = 1; j < 3; j++) {
fibonacci[j-1] = fibonacci[j];
}
fibonacci[2] = fibonacci[1] + fibonacci[0];
}
return fibonacci;
}
如果你试图打印Array
方法返回的值,那么你需要打印方法的结果而不是忽略返回值,并且你需要去掉方法中的打印语句:
public static void main(String[] args) {
int fibonacciNumberInOrder = 5;
System.out.println(Arrays.toString(fibonacci(fibonacciNumberInOrder)));
}
推荐阅读
- firebase - WFlutter Firebase - 从 firebase 文档中只获取一个数据字段
- python - 如何在 geckodriver selenium python 中加载扩展
- c# - 如何使用 .NET SDK 使用单个预签名 URL 将大文件上传到 s3 存储桶传输加速
- macros - 什么是 MAD_NSBSAMPLES 宏代表 libmad
- p5.js - 如何在到达 mouseX 和 mouseY 后删除“子弹”精灵?[P5.播放]
- reactjs - 在有限制的情况下获取数据
- node.js - Node Express 服务于 Angular 的旧版本
- bootstrap-4 - 如何让我的导航栏切换器仅在屏幕遇到 sm 断点时出现?
- typescript - 用自己的类中的泛型类型声明工厂
- python - VideoCapture 显示“无摄像头访问”占位符图像