public class Program {
public static void main(String[] args) {
int lastFibo = 1; // ADDED TO check if last fib calculated is over 4000000
for (int i = 3; lastFibo <= 4000000; i = i + (i - 1)) {
lastFibo = fibo(i);
}
}
public static int fibo(int i) {
int total = 0;
if (i % 2 == 0) {
total += i;
return total;
}
return total;
}
}
此代码的目的是打印斐波那契序列中偶数的总和,其值小于4百万。使用递归,代码返回堆栈溢出错误,因此建议迭代数字。遇到的困难是知道如何打印“总”变量。范围文章非常基础,并创建static int total = 0
return 0
。
答案 0 :(得分:2)
注意:问题的第一部分与误解有关。我认为有必要计算到fib(4000000)
。
您必须使用BigInteger
,否则您无法处理如此大的数字。这是一个有数千位数的数字!
fib(4000000)导致数字超过835k。无法使用int
或long
处理此问题。
类BigInteger
(或十进制值的等效BigDecimal
)可以处理此类问题。
注意:这是问题的答案
现在问题更清楚了,可以给出正确答案。
public void printEvenFib() {
int i = 1;
int lastFib = 1;
int sum = 0;
while (lastFib <= 4000000) {
if (lastFib % 2 == 0) {
sum += lastFib;
}
i++;
lastFib = fib(i);
}
System.out.println(sum);
}
// Without recursion
public int fib(int n) {
if (n <= 2) {
return 1;
}
int fibo1 = 1;
int fibo2 = 1;
int fibo = 0;
for (int i = 3; i <= n; i++) {
fibo = fibo1 + fibo2;
fibo2 = fibo1;
fibo1 = fibo;
}
return fibo;
}
答案 1 :(得分:2)
首先,正如一些评论所指出的那样:你的for循环不会迭代Fibonacci序列。其次,变量total
仅存在于fibo
方法的范围内。因此,每次调用该方法时,total
都会以值0
开头。
使用正确的Fibonacci算法并添加fibo
方法的返回值以计算总和:
public class Program {
public static void main(String[] args) {
int total = 0;
int previousValue = 0;
int currentValue = 1;
while (currentValue < 4_000_000) {
int nextPreviousValue = currentValue;
currentValue += previousValue;
previousValue = nextPreviousValue;
total += fibo(currentValue);
}
System.out.println(total);
}
public static int fibo(int i) {
if (i % 2 == 0) {
return i;
}
return 0;
}
}
4_000_000是一个整数文字,你可以使用Java 7以来的数字4000000.下划线的目的是使它对人类更好的可读性。以编程方式使用4000000没有区别。有关详细信息,请参阅The Java Tutorials中的Primitive Data Types。
答案 2 :(得分:1)
class Program2{
public static void main(String args[]){
int n1=0,n2=1,n3,total=0,i;
for(i=1;n3<4000000;++i){
n3=n1+n2;
if(n3%2==0)
total+=n3;
n1=n2;
n2=n3;
}
System.out.println("total is "+total);
}
}