Java - рекурсивный двойной факториал - PullRequest
0 голосов
/ 22 января 2020

Кто-нибудь может мне помочь улучшить этот алгоритм? Это рекурсивная функция, которая в основном выполняет факт (n) * факт (n), но я не могу понять, как сделать ее более эффективной.

static long doubleFactorial(int n)
{
    if (n == 0)
        return 1;

    System.out.println("DoubleFactorial(" + n + ") called");
    return n * doubleFactorial(n - 1) & doubleFactorial(n - 1);
}

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Просто сохраните его в переменную и не вызывайте его 2 раза:

Вот ваш код (при условии, что вы хотите умножить факториалы, а не И их)

static long doubleFactorial(int n) {
    if (n == 0)
        return 1; 
    System.out.println("DoubleFactorial(" + n + ") called");
    long fact=doubleFactorial(n - 1);
    return n * fact * fact;
}

Кроме того, было бы более эффективно, если вы удалите рекурсию (но вы, возможно, этого не захотите):

static long doubleFactorial(int n){
    long ret=1;
    for(int i=2;i<n;i++){
        ret=i*ret*ret;
    }
}

Это заменит рекурсию на al oop, что уменьшает количество вызовов метода и, следовательно, улучшает производительность.

Кроме того, он не создаст большой стек (и, возможно, StackOverflowError s)

0 голосов
/ 22 января 2020

Ваш лог c 1001 * doubleFactorial (5) = 14400

...