2013-03-07 3 views
1

У меня есть эта рекурсивную функцию факториала:Что происходит внутри этой рекурсивной функции?

public class Driver{ 
public static void main (String args[]) 
{ 

    System.out.println(factorial(5)); 

} 

private static int factorial(int n) 
{ 
    int product; 
    if (n <= 2){ product = n; return 2;} 
    else{ 
     product = n * factorial(n-1); 
     System.out.println("current product =" + product); 
     System.out.println("product = " + n + " * factorial(" + (n-1) + ")"); 
    } 
    return product; 
} 
} 

Он печатает следующее:

current product =6 
product = 3 * factorial(2) 
current product =24 
product = 4 * factorial(3) 
current product =120 
product = 5 * factorial(4) 
120 

Я пытаюсь выяснить, что, черт возьми, здесь происходит. Я не понимаю, как он начинает печатать для n = 2. И откуда появился текущий продукт = 6? Благодаря!

ответ

4

n==2 - это ваш базовый корпус, поэтому первая функция, проходящая ниже линии, - это та, где n-1 == 2 или n == 3. Это связано с тем, что ваш результат выполняется после рекурсивного вызова, поэтому он сначала печатает самый глубокий вызов (спасибо Патрисии Шанахан). Если вы хотите, чтобы он печатался с большого на маленький, переместите ваши строки println над строкой, которая вызывает рекурсивно factorial.

product = n * factorial(n-1); 

Также,

if (n <= 2){ product = n; return 2;} 

Это неправильно по многим причинам ..

Это должно быть

if (n <= 1){ return 1;} 

Если у вас возникли проблемы с пониманием этого, помните, что каждый вызов факториала является indepen вмятина других звонков.

+1

Обратите внимание, что выход выполняется после рекурсивного вызова, поэтому первые две строки относятся к самой глубокой активации, которая выводит. –

+0

ohh crapy Да, я вижу ошибку, теперь спасибо. Можете ли вы объяснить немного больше о том, что вы подразумеваете под «пройти мимо линии ниже». Благодаря! – papercuts

+0

@papercuts, если можно, попробуйте запустить его в отладчике, что может помочь лучше, чем я могу. –