Рекурсия Фибоначчи в Java — нет циклов?

Я не понимаю, что я должен делать. Мой профессор хочет, чтобы мы создали последовательность Фибоначчи, используя рекурсию. Циклы for не допускаются, и я (будучи любителем) не знаю, как создать строку, скажем, из 6 чисел в последовательности.

Вот его указания: "Используя рекурсию, создайте метод, который возвращает строку, содержащую последовательность Фибоначчи. Возьмите целое число, чтобы определить, сколько значений последовательности вы должны вернуть".

Это то, что у меня есть до сих пор...

import java.util.*;

public class fibo {

  public final static int n = 0;
  public static String s = "";

  public static void main(String[] args) {

    Scanner scn = new Scanner (System.in);

    System.out.println("Please put in a number.");

    int n = scn.nextInt();

    s = Integer.toString(n);

    System.out.println(n+ ": " + fibonacci(n));
  }

  public static int fibonacci(int n) {  

    if(n <= 1)
      return n;

    else       
      return fibonacci(n - 1) + fibonacci(n - 2);
  }
}

Кроме того, я чувствую, что многое из этого действительно неэффективно и грязно. Может ли кто-нибудь действительно объяснить и помочь мне с тем, что я должен делать?


person user2177177    schedule 16.03.2013    source источник
comment
Похоже, он, вероятно, делает то, о чем вас просили. Я подозреваю, что эффективность может прийти позже. По общему признанию, это не то, как я бы обрабатывал отрицательные значения...   -  person Jon Skeet    schedule 16.03.2013


Ответы (4)


Похоже, вы генерируете n-е число в последовательности Фибоначчи, мне кажется, вам нужно хранить все генерируемые вами значения (не только последнее) и отображать их.

Таким образом, вместо того, чтобы просто f(n), вам нужно отобразить f(1), f(2), ..., f(n-1), f(n) после того, как вы выполнили задание.

person Chris Cooper    schedule 16.03.2013
comment
Не только это, но и создание последовательности должно содержаться внутри рекурсивной функции. Можно было бы сделать это как отдельную, также рекурсивную функцию, чтобы обойти требование отсутствия циклов, и это, безусловно, было бы проще, так как объединение ее в одну функцию оставило бы вам много беспорядочного состояния, передаваемого в параметры. - person Logan Pickup; 01.09.2013

Это должно работать нормально:


public class Fibonacci {

  public static void main(String[] args) {
    System.out.println(Fib(3));

  }

  // returns the next number in the Fibonacci sequence
  public static int Fib(int n) {
    if (n < 2) {
      return n;
    } else {
      return Fib(n - 1) + Fib(n - 2);
    }
  }
}
person vtboyarc    schedule 28.06.2019

Вот код, который работает хорошо, без лишнего кода.

import java.util.*;

public class Fibonaccis {



  public static void main(String[] args) {

    Scanner scn = new Scanner (System.in);

    System.out.println("Lägg in ett nummer.");

    int n = scn.nextInt();



    System.out.println(n+ ": " + fibonacci(n));
  }

// TODO Auto-generated method stub

  public static int fibonacci(int n) {  

    if(n <= 1)
      return n;

    else       
      return fibonacci(n - 1) + fibonacci(n - 2);
  }
}
person Ahmed Nasrullah    schedule 04.12.2013

Этот код показывает Фибоначчи до 8 без цикла...

public class FinnonnacciDemo2 {

    static int no = 0, n = 8;

    public static void main(String[] args) {
        // This will print series till 8
        fib(0, 1);
    }

    public static void fib(int a, int b) {
        // Terminating condition.
        if (a >= n) {
            return;
        }

        else {
            System.out.print("\t" + no);
            no = a + b;
            a = b;
            b = no;
            fib(a, b);
        }
    }
}
person Bhushankumar Lilapara    schedule 27.09.2013