Как вернуть целочисленный массив в Java с использованием рекурсивной функции и без использования циклов? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь подключить Java-эквивалент этой функции JavaScript:

const fibonacci_nth = (n) => {
    if (n === 0) return 0;
    if (n === 1) return 1;
    else return fibonacci_nth(n-2) + fibonacci_nth(n-1);
}

const fibonacci_series = (n) => {
    if (n === 0) return [fibonacci_nth(0)];
    return [...fibonacci_series(n-1), fibonacci_nth(n)];
}

Но я застрял, потому что не знаком с синтаксисом Java;

public static int fibonacci_nth(int n) {
    if(n == 0) return 0;
    if(n == 1) return 1;
    else return fibonacci_nth(n-2) + fibonacci_nth(n-1);
}

public static int[] fibonacci_series(int n) {
    int intArray[];
    if(n == 0) return intArray[fibonacci_nth(n)];
    else return intArray[..., fibonacci_series(n-1), fibonacci_nth(n)]; // <- syntax error
}

Примечание: производительность не моя цель.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вы можете использовать

public static int[] fibonacci_series(int n) {
    return IntStream.range(0, n+1).map(i->fibonacci_nth(i)).toArray();
}
0 голосов
/ 30 января 2019

Пожалуйста, найдите ниже то, что пришло мне в голову, когда я прочитал ваше сообщение:

import java.util.Arrays;
import java.util.stream.IntStream;

public class TestFib {
    public static void main(String args[]) {
        System.out.println(Arrays.toString(fibonacci_series3(8)));
    }
    public static int fibonacci_nth(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        else return fibonacci_nth(n-2) + fibonacci_nth(n-1);
    } 
    //helper method to concatenate two arrays (java doesn't have sth like arr1 + arr2)
    public static int[] concatenate(int[] a, int[] b){
        int length = a.length + b.length;
        int[] result = new int[length];
        System.arraycopy(a, 0, result, 0, a.length);
        System.arraycopy(b, 0, result, a.length, b.length);
        return result;
    }
    // concatenate the fibonacci_series array of n-1 
    // with the one element array of fibonacci_nth (n)
    public static int[] fibonacci_series(int n) {          
        if(n == 0) 
            return new int[]{0};
        else{
            return concatenate(fibonacci_series(n-1),new int[] {fibonacci_nth(n)});
        }            
    }
    // the same as above but using IntStream to simulate sth like
    // IntStream.of(fibonacci_nth(0), fibonacci_nth(1), .... fibonacci_nth(n))
    public static int[] fibonacci_series2(int n) {          
        if(n == 0) 
            return IntStream.of(n).toArray();
        else{
            return IntStream.of(concatenate(fibonacci_series2(n-1),new int[]{fibonacci_nth(n)})).toArray();
        }            
    }
    //no recursion at all, but also using IntStream to map n to nth fibonacci number
    public static int[] fibonacci_series3(int n) { 
        return IntStream.range(0, n+1).map(i->fibonacci_nth(i)).toArray();                   
    }
}
...