2016-02-14 3 views
0

Так вот код питона:Преобразование кода фибоначчи python в java?

def fib(n): 
    ## Handle special case when n == 0 
    if n == 0: 
    return 0 
    ## General case, return the first of the 
    ## two values returned by fibaux 
    else: 
    return fibaux(n)[0] 

## Auxiliary function 
## Return the nth and (n-1)th Fibonacci numbers 
## n must be an integer >= 1 
def fibaux(n): 
    ## Base case of for recursion 
    if n == 1: 
    return 1, 0 
    else: 
    ## Recursive case 
    f2, f1 = fibaux(n - 1) ## **this is the part I cant figure out in java** 
    return f2 + f1, f2 

** часть кода (f2, f1 = fibaux (п - 1)) не прямо в моем Java code.here является Java-код:

public static int[] fib(int number){ 
    if (number == 0){ 
    return new int[] {0}; 
    } 
    else{ 
    int fibauxArray[] = fibaux(number); 
    int f3 = fibauxArray[0]; 
    return new int[] {f3}; 
    } 
} 

public static int[] fibaux(int number){ 
    if (number == 1){ 
    return new int[] {1, 0}; 
    } 
    else{ 
    int[] Q = fibaux(number-1); 
    int[] R = fibaux(number-1); 
    int f2 = Q[0] + R[0]; 
    int f1 = Q[0]; 

    return new int[] {f2, f1}; 
} 

в питона, f2 и f1 разные значения, но в моем Java кода Q [] и R [] имеют одинаковое значение, так что не рассчитывает правильные result.I не понимаю, как сделать это Работа? Спасибо!

+0

Почему вы возвращающая одно значение в массиве? Кроме того, откуда взялся «R»? –

+0

Если вы просто хотите перевести Python на Java, вы должны сохранить одну и ту же организацию, например public static int fib (int number) - вернуть число для двух случаев, а не массивы, и нет необходимости в Q и R, просто используйте один результат из рекурсии, как и в Python. –

+0

Я рассматривал Q [] как f2 и R [] как f1 из кода python. И да, вы правы, функция fib() не нуждается в возврате массива. – Jessica

ответ

4

Try:

public static int fib(int number){ 
    if (number == 0){ 
    return 0; 
    } 
    else{ 
    int fibauxArray[] = fibaux(number); 
    return fibauxArray[0]; 
    } 
} 

public static int[] fibaux(int number){ 
    if (number == 1){ 
    return new int[] {1, 0}; 
    } 
    else{ 
    int[] Q = fibaux(number-1); 
    int f2 = Q[0]; 
    int f1 = Q[1]; 

    return new int[] {f2+f1, f2}; 
} 
} 
+0

Спасибо! но когда я делаю это, он всегда возвращает 1, любую идею, почему? – Jessica

+0

неважно, вам нужно сделать f2 Q [1] и f1 Q [0], чтобы он работал для меня. – Jessica

+0

return new int [] {f2 + f1, f1}; должен быть лучше –

0

Использование Pair класс:

class Pair { 
    private int first; 
    private int second; 
    // getters, setters, constructor 
} 

Эта часть:

def fib(n): 
    ## Handle special case when n == 0 
    if n == 0: 
    return 0 
    ## General case, return the first of the 
    ## two values returned by fibaux 
    else: 
    return fibaux(n)[0] 

можно "перевести" на:

int fib(int n) { 
    // Handle special case when n == 0 
    if (n == 0) { 
    return 0; 
    } 
    // General case, return the first of the 
    // two values returned by fibaux 
    else { 
    return fibaux(n).getFirst(); 
    } 
} 

И эта часть:

## Auxiliary function 
## Return the nth and (n-1)th Fibonacci numbers 
## n must be an integer >= 1 
def fibaux(n): 
    ## Base case of for recursion 
    if n == 1: 
    return 1, 0 
    else: 
    ## Recursive case 
    f2, f1 = fibaux(n - 1) ## **this is the part I cant figure out in java** 
    return f2 + f1, f2 

к:

// Auxiliary function 
// Return the nth and (n-1)th Fibonacci numbers 
// n must be an integer >= 1 
Pair fibaux(int n): 
    // Base case of for recursion 
    if (n == 1) { 
    return new Pair(1, 0); 
    } else { 
    // Recursive case 
    Pair next = fibaux(n - 1); 
    return new Pair(next.getFirst() + next.getSecond(), next.getFirst()); 
    } 
} 

(Demo)

0

fibaux возвращает элемент массива в п индексом 0 и N-1 в индексе 1.

Не выполняйте фибос дважды. Просто используйте результат первого выполнения.

Таким образом, вы должны сделать это таким образом ..

else{ 
int[] Q = fibaux(number-1); 
int f2 = Q[1] + Q[0]; 
int f1 = Q[0]; 
return new int[] {f2, f1};