Java斐波那契堆栈溢出错误
Java fibonacci stack overflow error
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.WhosebugError 中出现异常但是如果我将 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,请问为什么?
您不处理 num == 0
的情况,因此当您调用 fibonacci(0)
时,递归永远不会结束,导致堆栈已满时 WhosebugError
。
你可以通过改变循环的范围来解决它
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)
的中间结果并在为 n > i
计算 fibonacci(n)
时重新使用它们会更有效率(而不是进行不必要的扩展递归调用)。
在 for 语句中,您从 0 开始。这是 fibonacci-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));
}
我想你没有处理零。只需尝试以下循环,
for (int j=1; j<=i; j++) {
System.out.println(fibonacci(j));
}
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.WhosebugError 中出现异常但是如果我将 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,请问为什么?
您不处理 num == 0
的情况,因此当您调用 fibonacci(0)
时,递归永远不会结束,导致堆栈已满时 WhosebugError
。
你可以通过改变循环的范围来解决它
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)
的中间结果并在为 n > i
计算 fibonacci(n)
时重新使用它们会更有效率(而不是进行不必要的扩展递归调用)。
在 for 语句中,您从 0 开始。这是 fibonacci-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));
}
我想你没有处理零。只需尝试以下循环,
for (int j=1; j<=i; j++) {
System.out.println(fibonacci(j));
}