Что именно происходит в этой программе конкретно в выражении возврата? - PullRequest
0 голосов
/ 26 апреля 2019

Фактическая операция выполняется в строке возврата

return (num == 1 ? 1 : num * firstFactorial(num - 1 ) );

Как мы получаем 40320 для числа 8 ?

public class Factorial    {
    public static int firstFactorial(int num)   {
        return (num == 1 ? 1 : num * firstFactorial(num - 1 ) );
    }
    public static void main(String[] args)  {
        System.out.println(firstFactorial(8));
    }    
}

1 Ответ

0 голосов
/ 26 апреля 2019

В этом выражении возврата происходит несколько вещей.Можно переписать функцию firstFactorial следующим образом:

public static int firstFactorial(int num) {
    if (num == 1) {
       return 1;
    }

    int decreased          = num - 1;
    int recursiveFactorial = firstFactorial(decreased);
    int result             = num * recursiveFactorial;

    return result;
}

Прежде всего, для этого используется метод recursion .Функция вызывает себя с параметром числа, уменьшенным на один.Вы можете думать об этом так:

1. You call firstFactorial with value of 8
2. firstFactorial(8) calls itself with a value of 7
3. firstFactorial(7) calls itself with a value of 6
...
8. firstFactorial(2) calls itself with a value of 1
9. firstFactorial(1) returns 1 because of the if-statement

После вызова самого себя функция умножает возвращаемое значение рекурсивного вызова на свой собственный параметр и возвращает его.Таким образом, это будет продолжаться так:

10. firstFactorial(2) multiplies 1 with 2 and returns 2
11. firstFactorial(3) multiplies 2 with 3 and returns 6
10. firstFactorial(4) multiplies 6 with 4 and returns 24
...
14. firstFactorial(8) multiplies 5040 with 8 and returns 40320 to you

Все вместе это вычислит способность значения следующим образом: 8 * 7 * 6 * ... * 1

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

public static int firstFactorial(int num) {
    if (num == 1) {
       return 1;
    }

    return num * firstFactorial(num -1);
}

Затем в java есть троичный условный оператор (<cond> ? <true statement> : <false statement>), который позволяет вам выразить все тело функции.в одну строку:

public static int firstFactorial(int num) {
    if (num == 1) {
       return 1;
    }

    return (num == 1) ? 1 : (num * firstFactorial(num -1));
}
...