我目前正在学习Java,而我刚刚开始学习,所以我对它的了解并不是很好。 我在编写的程序中遇到问题,该程序计算 Fibonacci sequence的前100个值。关键是它只输出2而不是其他数字。
这是我的程序代码:
class MyClass1 {
public static void main(String[ ] args) {
int[] fib = new int[102];
fib[0] = 1;
fib[1] = 1;
int counter = 0;
int n1, n2, fibSum;
while(counter < (fib.length - 2)){
n1 = fib[counter];
System.out.println(fib[counter]);
counter++;
n2 = fib[counter];
System.out.println(n2);
counter++;
fibSum = n1 + n2;
System.out.println(fibSum);
fib[counter] = fibSum;
}
}
}
感谢您的帮助。
答案 0 :(得分:1)
Fibonacci number是前两个数字的总和:
fibonacci(n) = fibonacci(n - 1) + fibonacci(n - 2)
所以使用递归可以很好地评估它:
private static long fibonacci(int n) {
if (n <= 1) return n;
else return fibonacci(n - 1) + fibonacci(n - 2); }
public static void main(String[] args) {
int n = 102;
for (int i = 1; i <= n; i++)
System.out.println(i + ": " + fibonacci(i));
}
答案 1 :(得分:1)
您的代码中存在一些逻辑错误。
第一个循环: -
最初n1 = fib [0] = 1且n2 = fib [1] = 1并打印两者。 fib [2]是总和,所以它是2.到目前为止一直很好。
第二个循环: -
n1 = fib [2] = 2. n2 = fib [3] = 0因此fib [4] = 2.这就是问题发生的地方。因此,您将始终在第二个循环的输出中看到2 0 2。
对于Fibonacci序列,您需要添加前两个值,但您只考虑代码中的先前值。这是您的代码的更正版本: -
public static void main(String[ ] args) {
double[] fib = new double[100];
fib[0] = 1;
fib[1] = 1;
int counter = 2;
double n1, n2, fibSum;
System.out.println(fib[0]);
System.out.println(fib[1]);
while(counter < fib.length){
n1 = fib[counter-1];
n2 = fib[counter-2];
fibSum = n1 + n2;
System.out.println(fibSum);
fib[counter] = fibSum;
counter++;
}
}
请注意,我使用的是double类型,因为int或者甚至long类型不足以在此序列中达到第100个术语。
答案 2 :(得分:0)
你的问题是那个
A)所有数组值都初始化为0
B)在为其分配值之前,您正在访问“下一个”数组值!
将输出更改为:
<?php if($this->session->flashdata('error_msg1')) : ?>
<div class="alert alert-success">
<span class="alert-rr">
<i class="fa fa-check-circle" aria-hidden="true"></i>
</span>
<span class="alert-msg">
<?php echo $this->session->flashdata('error_msg1'); ?>
</span>
</div>
<?php endif; ?>
你会发现它打印出来:
System.out.println("1. counter: " + counter + "/" + fib[counter]);
counter++;
n2 = fib[counter];
System.out.println("2. counter: " + counter + "/" + fib[counter]);
counter++;
fibSum = n1 + n2;
fib[counter] = fibSum;
System.out.println("3. counter: " + counter + "/" + fib[counter]);
最后一行显示了正在发生的事情:在为其分配值之前,在索引3处获取值。因此,你的整个斐波纳契总和......并没有“开始”;因为你不断失去价值观。
换句话说:你必须确保你的计数器正常增加:
1 counter: 0/1
2 counter: 1/1
3 counter: 2/2
1 counter: 2/2
2 counter: 3/0
含义:对于每个计数器值,您需要一个完整循环。当你运行我的解决方案时,你会发现它运行良好(直到计数器命中44/45并且我们遇到int溢出;因为数字太大了)。
答案 3 :(得分:0)
在第一次迭代后,您将拥有以下值:
n1 = 1
n2 = 1
fibsum = 2
fib [2] = 2
从fib [3]到长度的所有其他值都未初始化。
所以在第二次迭代中:
n1 = 2 现在计数器值将增加1,这是counter = 3
n2 = fib [3]
//这个没有正确计算,因此问题。