计算Fibonacci系列中终止条件的执行

时间:2018-04-28 06:23:53

标签: java algorithm fibonacci

遵循伪码,计算第n个斐波纳契数:

int fibonacci(int n)
{
    if (n == 0){
        print(0)
        return 0
    }
    if (n == 1)
    {
        print(1)
        return 1
    }
    return fibonacci(n - 1) + fibonacci(n - 2)
}

如果调用fibonacci(3),则会发生以下情况:

  
      
  • 斐波那契(3)称为斐波纳契(2)和斐波那契(1)(第一次召唤)。
  •   
  • 斐波纳契(2)称为斐波那契(1)(第二次调用)和斐波那契(0)。
  •   
  • 第二次调用斐波那契(1)打印1并返回1.
  •   
  • fibonacci(0)打印0并返回0.
  •   
  • 斐波纳契(2)得到斐波那契(1)和斐波那契(0)的结果并返回1.
  •   
  • 第一次调用斐波那契(1)打印1并返回1.
  •   
  • 斐波那契(3)得到斐波那契(2)和斐波那契(1)的结果并返回2.
  •   

总共会打印1次,打印0次。

目的是知道给定整数N将打印0和1的次数。

INPUT 第一行包含一个整数T,表示测试用例的数量。 下一行T行包含整数N

OUTPUT 对于每个测试用例,打印一行输出,其中包含由空格分隔的2个整数。第一个整数是打印0的次数。第二个整数是打印1的次数。

约束

1 <= T <= 50
0 <= N <= 40

SAMPLE INPUT

2

0

3 

SMAPLE OUTPUT

1 0

1 2

代码

public class Fibonacci {

    /**
     * @param args
     */
static int zero =0,one = 0;
public static void main(String[] args) {
    // TODO Auto-generated method stub
    int[] input = readInput();
    for(int i =0; i < input.length;++i) {
        System.out.println(getOutput(input[i]));
    }
}
public static int[] readInput() {
    BufferedReader bufferReader = new BufferedReader(new InputStreamReader(System.in));
    String temp;
    int[] input = null;
    try {
        temp =bufferReader.readLine();  
        int counter = Integer.parseInt(temp);
        input = new int[counter];
        for(int i =0 ; i < counter ;++i)    {
            input[i] =Integer.parseInt(bufferReader.readLine());
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return input;
}
public static String getOutput(int number)  {
    //System.out.println(fibonacci(number));
    return zero+" "+one;
}
public static int fibonacci(int n) {
    if (n == 0) {
        //System.out.println(0);
        ++zero;
        return 0;
    }
    if (n == 1) {
        //System.out.println(1);
        ++one;
        return 1;
    }
    return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

这适用于第一个测试用例,但后续测试用例无效。

1 个答案:

答案 0 :(得分:1)

我认为你需要在调用getOutput之前重置零和一的值。

    for(int i =0; i < input.length;++i) {
        zero = 0;
        one = 0;
        System.out.println(getOutput(input[i]));
    }