2015-11-17 3 views
1

Я пытаюсь сделать программу, которая вычисляет двойные факториалы (пример - n = 3, => (3!)! = 6! = 720), но у меня есть некоторые проблемы с рекурсивным дном и У меня есть исключение переполнения стека.Исключение переполнения стека с рекурсией

public static long df(long n) { 
    if (n == 1) { 
     return 1; 
    } else { 
     return df(n * df(n - 1)); 
    } 
} 

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

ответ

3

Вы столкнулись бесконечный цикл с df(n * df(n - 1));

n * df(n-1) будет вычислять факториал, и вы невольно кормите ответ обратно в рекурсивный метод, заставляя его идти вечно

Изменение

return df(n * df(n - 1)); 

в

return n * df(n - 1); 

и вы должны получить правильный результат для факториалов


После того, как вы это работает рекурсивная факторный метод, становится намного проще создать двойной факториал только с помощью df(df(3))

+1

Пожалуйста, прочтите мой вопрос и пример. – NoSuchUserException

+0

Решение, которое вы предлагаете, вычисляет факторный рекурсивно - 3! = 6. Но я пытаюсь вычислить это (3!)! = 6! = 720. Я пытаюсь вычислить факториал дважды рекурсивно. – NoSuchUserException

+1

@NoSuchUserException Не похоже, что есть хороший способ сделать это с помощью одного метода, но просто используя 'df (df (input))' должен дать вам то, что вы хотите – phflack

1

Я думаю, что вы следует использовать взаимную рекурсию с помощью факториала.

Общий г-факториала можно составить факторных g раз:

public static long gf(long n, long g) { 
    if (g == 1){ 
     return fact(n); 
    } 
    return fact(gf(n, g - 1)); 
} 

Конкретная двойной факториал может быть gf(n, 2):

public static long df(long n) { 
    return gf(n, 2); 
} 

И факторный вспомогательные функции:

public static long fact(long n) { 
    if (n == 1) { 
     return 1; 
    } else { 
     return n * fact(n - 1); 
    } 
} 

Теперь тест:

public static void main(String[] args) { 
    System.out.println(df(3)); 
} 
-2

Прежде чем спросить на стеке. Вы Шоуда проверить на Wiki, если код не существует ...

И он существует ....

Algorithme [модификатор | Модификатор ле-код] Ле Расчитать де ла factorielle Peut себе traduire пар l'algorithme récursif Suivant, écrit ан псевдокода:

Fonction factorielle (п: entier): entier Début
Si, п> 1 Retourner н * factorielle (п - 1) Sinon Retourner 1 Fin Fin си

[https://fr.wikipedia.org/wiki/Factorielle#Algorithme]

Просто прочитайте Wiki и ответ writted ...

Смежные вопросы