即使条件为真,返回语句也不会突破块

时间:2014-09-06 04:57:15

标签: java math return fibonacci

这是一个简单的程序来检查一个数字是否为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));

} }

4 个答案:

答案 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一次又一次被发现。

请参阅http://ideone.com/1d440f

答案 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;
    }
}