2016-09-06 2 views
1

Мне нужно написать java-методы для вычисления серии Fibonacci ЛЮБОГО первых двух чисел, вмененных пользователем, предположим, что пользователь вводит 10 и 20 и хочет первые 5 номеров серии , выход будет 10 20 30 50 80. Я уже реализовал итеративный метод, который делает это, но моя проблема заключается в методе RECURSIVE для его выполнения.java fibonacci из ЛЮБОГО первых двух чисел

public int fRec(int n) 
    { 
     //base case of recursion 
     if ((n == 0) || (n == 1)) 
      return n; 
     else 
      //recursive step 
      return fRec(n-1) + fRec(n-2); 
    } 

Это типичный рекурсивный метод Фибоначчи, параметр n представляет до какой номер пользователь хочет серии бежать, но как я могу изменить его, чтобы убедиться, что серия использует первый два номера, с которых пользователь хочет начать серию?

+1

Примечание: если вы используете рекурсию без запоминания вашего метода будет принимать 'О (е^п)', который быстро больше, чем возраст Вселенной. –

ответ

2

Начнем с конкретных цифр в серии они должны будут быть возвращены 0 и 1:

public int fib(int n, int start1, int start2) { 
    switch (n) { 
     case 0: return start1; 
     case 1: return start2; 
     default: return fib(n-1, start1, start2) + fib(n-2, start1, start2); 
    } 
} 

Это довольно трудоемкий способ расчета нескольких членов ряда, как это происходит все пути назад к старту каждый раз. Лучше бы инкапсулировать в классе:

class Fib { 
    private int previous; 
    private int current; 

    public Fib(int start1, int start2) { 
     this.previous = start1; 
     this.current = start2; 
    } 

    public int next() { 
     int temp = previous + current; 
     previous = current; 
     current = successor; 
     return current; 
    } 
} 
+0

ahh я вижу, я знал, что это было что-то глупое, но просто не могло его увидеть. Спасибо!! –

3

Я хотел бы использовать memoization с Map<Integer,Long> и передать first и second термины в конструктор. Например,

public class Fibonacci { 
    public Fibonacci(long first, long second) { 
     memo.put(0, first); 
     memo.put(1, second); 
    } 
    Map<Integer, Long> memo = new HashMap<>(); 

    public long fRec(int n) { 
     if (n < 0) { 
      return -1; 
     } 
     if (memo.containsKey(n)) { 
      return memo.get(n); 
     } 
     long r = fRec(n - 2) + fRec(n - 1); 
     memo.put(n, r); 
     return r; 
    } 

    public static void main(String[] args) { 
     Fibonacci f = new Fibonacci(10, 20); 
     for (int i = 0; i < 5; i++) { 
      System.out.println(f.fRec(i)); 
     } 
    } 
} 

, который выводит (по запросу)

10 
20 
30 
50 
80 
0

Это еще один способ вычисления ряда Фибоначчи любых первых двух чисел.

общественного класс StackOverflow {

public static void main(String[] args) { 

    int first = 10, second = 20; 
    System.out.println(first); 
    System.out.println(second); 
    recursive(first, second, 2); 
} 

public static void recursive(int first, int second, int count) { 
     if (count != 5){ 
      int temp = first+second; 
      first= second; 
      second = temp; 
      System.out.println(second); 
      recursive(first, second, ++count); 
     }  
} 

}

Смежные вопросы