public static void main(String[] args) {
one();
System.out.println();
}
public static void one() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int i = sc.nextInt();
for (int j=0; j<i; j++) {
System.out.println(fibonacci(j));
}
}
public static int fibonacci(int num){
if (num == 1) {
return 0;
}
else if (num == 2 || num == 3){
return 1;
}
else {
return fibonacci(num-1) + fibonacci(num-2);
}
}
当我运行时,会在线程“main” java.lang.StackOverflowError 中获得Exception但是如果我将one()更改为
public static void one() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int i = sc.nextInt();
System.out.println(fibonacci(j));
}
我不会得到错误,即使我输入1,我可以问为什么?
答案 0 :(得分:3)
你没有处理num == 0
的情况,所以当你调用fibonacci(0)
时,递归永远不会结束,当堆栈已满时会导致StackOverflowError
。
您可以通过更改循环范围来解决此问题
for (int j=1; j<i; j++) {
System.out.println(fibonacci(j));
}
或通过更改递归方法的停止条件:
public static int fibonacci(int num) {
if (num <= 1) {
return 0;
}
else if (num == 2 || num == 3){
return 1;
}
else {
return fibonacci(num-1) + fibonacci(num-2);
}
}
也就是说,存储fibonacci(i)
的中间结果会更有效,并在为fibonacci(n)
计算n > i
时重复使用它们(而不是进行不必要的扩展递归调用)。
答案 1 :(得分:1)
在for-Statement中,你从0开始。这是斐波那契 - Funktion的第一个输入。尝试:
public static void one() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
int i = sc.nextInt();
for (int j=1; j<i; j++) {
System.out.println(fibonacci(j));
}
答案 2 :(得分:-1)
我认为你错过了处理零。只需尝试以下循环,
for (int j=1; j<=i; j++) {
System.out.println(fibonacci(j));
}