这是一个简单的程序来检查一个数字是否为Fibonnacci。我有一个神秘的错误:没有触发“return true”语句。相反,“hi”将被多次打印。返回应该突破方法,有没有人知道为什么不是?谢谢!
import java.util.*;
public class Solution {
public static boolean listFibs (long oldestFib, long oldFib, long input) {
long newFib = oldestFib + oldFib;
while (newFib < Math.pow(10,10)) {
if (newFib == input) {
System.out.println("hi");
return true;
}
listFibs(oldFib, newFib, input);
}
return false;
}
public static void main(String[] args) {
/*Scanner in = new Scanner(System.in);
int testCases = in.nextInt();
for (int i = 0; i < testCases; i++) {
int a = in.nextInt();
System.out.println("A= " + a);
System.out.println(listFibs(0, 1, a));
}*/
System.out.println(listFibs(0, 1, 5));
} }
答案 0 :(得分:3)
由于递归,有许多listFibs
的化身。 return
只留下其中一个。
在给出的示例中,您将收到以下呼叫:
listFib(0,1,5)
listFib(1,1,5)
listFib(1,2,5)
listFib(2,3,5)
-> true
listFib(2,3,5) // called again due to the loop
-> true
listFib(2,3,5) // called again due to the loop
-> true
listFib(2,3,5) // called again due to the loop
-> true
listFib(2,3,5) // called again due to the loop
...
答案 1 :(得分:0)
实际上,如果多次打印“hi”,则必须同时执行return语句。如果你在return语句中安装一个断点,你会看到。
你的函数是recursion
,并且会多次调用“listFibs”。
答案 2 :(得分:0)
打印方法中所有3个变量的值,您就会知道错误是什么。您正在使用递归,查看它被调用的次数。
此外,在调用listFib
之后,执行将再次进入while循环。你至少需要说return listFibs
。在listFibs
和while循环条件之间,没有任何变化。 2,3,5一次又一次被发现。
答案 3 :(得分:0)
你只有一步......递归调用不会对你从listFibs获得的结果做任何事情,所以程序会看到如下内容:
while (newFib < Math.pow(10,10)) {
if (newFib == input) {
System.out.println("hi");
return true;
}
true //or false
}
尝试添加这个额外的小IF语句。一旦找到真实结果,它将被传递回链中并退出函数。
while (newFib < Math.pow(10,10)) {
if (newFib == input) {
System.out.println("hi");
return true;
}
if listFibs(oldFib, newFib, input){
return true;
}
}