Как создать последовательность Фибоначчи в Java - PullRequest
5 голосов
/ 25 июня 2009

Я действительно отстой в математике. Я имею в виду, я действительно сосать математику. Я пытаюсь создать простой класс последовательности Фибоначчи для алгоритма, который буду использовать. Я видел пример Python, который выглядит примерно так:

a = 0
b = 1
while b < 10:
    print b
    a, b = b, b+a

Проблема в том, что я не могу заставить эту работу работать на любом другом языке. Я бы хотел, чтобы это работало на Java, поскольку я могу в значительной степени перевести его на другие языки, которые я использую оттуда. Это общая мысль:

    public class FibonacciAlgorithm {

    private Integer a = 0;

    private Integer b = 1;

    public FibonacciAlgorithm() {

    }

    public Integer increment() {
        a = b;
        b = a + b;
        return value;
    }

    public Integer getValue() {
        return b;
    }
}

Все, что я получаю, это удвоение, что я мог бы сделать с умножением :( Может кто-нибудь мне помочь? Math PWNS меня.

Ответы [ 10 ]

7 голосов
/ 25 июня 2009

Я бы сделал это так:

public class FibonacciAlgorithm {

    private int a = 0;

    private int b = 1;

    public FibonacciAlgorithm() {

    }

    public int increment() {
        int temp = b;
        b = a + b;
        a = temp;
        return value;
    }

    public int getValue() {
        return b;
    }
}

Это позволяет максимально приблизить его к исходному Java-коду.

[Примечание редактора: Integers заменены на ints. Нет смысла использовать Integers для этого.]

4 голосов
/ 25 июня 2009

Линия

a, b = b, b+a

Не легко переводить. Это как то так. Вы могли бы упростить это. Это буквальное значение.

t1 = b
t2 = b+a
a = t1
b = t2
2 голосов
/ 25 июня 2009

Вам необходимо сначала сохранить значение a или b во временной переменной;

    public Integer increment() 
    {                
            int temp = a;
            a = b;
            b = temp + b;
            return value;
    }
1 голос
/ 25 июня 2009

Java целые числа могут хранить только первые 46 чисел Фибоначчи, используйте справочную таблицу.

0 голосов
/ 11 апреля 2010

я сделаю это

fib = 100;
for(int a = 1, b = 0;a <= fib;a += b, b = (a-b)) {
    System.out.print(a + ",");
}
0 голосов
/ 25 июня 2009

Выше было опубликовано рекурсивное решение, но это решение хвостовое, поэтому оно растет линейно.

public class Fibonacci {
    public long fibonacci(int number) {
        return fib(0,1,number);
    }

    private long fib(long result, long next, int n) {
        if (n == 0)
            return result;
        else
            return fib(next, result+next, n-1);
    }
}
0 голосов
/ 25 июня 2009

Основная проблема с вашим переводом с Python на Java заключается в том, что оператор присваивания Python там выполняется одновременно, а Java - последовательно. Заявление Python эквивалентно высказыванию этого:

Make a list out of 'b' and 'a + b'
Make another list out of references to 'a' and 'b'
Assign all the elements from the second list to the first one

(На самом деле это может быть кортеж, я не очень хорошо говорю на Python.)

Таким образом, 'b' и 'a + b' преобразуются в значения до того, как они назначены. Вы не можете делать такое множественное одновременное назначение в Java.

В общем, оператор на Python похож на

var1, var2, ...varN = expression1, expression2, ...expressionN

собирается перевести на Java на

temp1 = expression1;
temp2 = expression2;
...
tempN = expressionN;
var1 = temp1;
var2 = temp2;
...
varN = tempN;

Таким образом, все выражения разрешаются в значения до назначения происходят, и ни одно из назначений не имеет побочных эффектов на выражения.

Если бы я делал это по-настоящему, я, вероятно, составил бы таблицу поиска и сохранил бы длинные (поскольку числа Фибоначчи неопределенно растут экспоненциально, и я бы хотел пройти дальше 46). Итеративная форма, как и у вас, будет принимать O (N) для вычисления N-го значения Фибоначчи; типичная рекурсивная формулировка будет принимать столько же вызовов функций, сколько и возвращаемое значение. Фибоначчи практически просит где-то кэшировать ответы, и это сделает рекурсивную форму гораздо более выполнимой.

0 голосов
/ 25 июня 2009

Разве вы не хотите создать функцию, которая будет возвращать n-е число Фибоначчи? Вот как я помню, чему меня учили, когда я был ребенком:

public int Fibb(int index) {
if (index < 2)
    return 1;
else
    return Fibb(index-1)+Fibb(index-2);
};

Учитывая, что первая пара чисел Фиббоначи определяется как 1, а все остальное основано на этом. Теперь, если вы просто хотите распечатать Fibonaccis, цикл может быть проще, о чем говорится в других ответах.

0 голосов
/ 25 июня 2009

Я просто переведу ваш предыдущий код:

public void fibb(int max) {
  int a = 0;
  int b = 1;
  while (a < max) {
    System.out.println(a);
    int temp = a + b;
    a = b;
    b = temp;
  }
}
0 голосов
/ 25 июня 2009

public Integer increment () { а = б; б = а + б; возвращаемое значение; }

Конечно, неправильно. Я думаю, что переключение первых двух строк должно сработать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...