Отслеживание порядка выполнения в Java - PullRequest
0 голосов
/ 13 ноября 2010

У меня есть факториальный код

class FactorialTest {

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

    public static int factorial(int N){
        if (N <= 1) return 1;
        return N*factorial(N-1);
    }
}

Он был отслежен с использованием Trace , и это вывод:

alt text

Означает ли это, что рекурсивная часть всегда выполняется первой, а умножение - позже?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2010

Возможно реализовать факториал, используя хвостовую рекурсию, но в вашем коде умножение следует за рекурсивным вызовом, поэтому оптимизация хвостовой цепочки не может быть применена.

0 голосов
/ 13 ноября 2010

Конечно, рекурсивный вызов должен быть оценен первым.Вы умножаете два выражения, одно из которых является просто значением (N), а другое - рекурсивным вызовом.Не звоня и не получая результат первым, как вы могли бы умножить это на N?

0 голосов
/ 13 ноября 2010

Сначала необходимо выполнить рекурсию, поскольку она является аргументом для умножения. До того, как закончится рекурсия, что еще будет умножено?

Я не думаю, что ваш вывод Trace говорит вам об этом, хотя. Я отвечаю только после прочтения кода.

...