Что происходит с оператором if, когда это правда? - PullRequest
0 голосов
/ 14 апреля 2020

Я начал с HackerRank, и я чертовски новичок.

Итак, у меня вопрос к этому коду:

'use strict';

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', inputStdin => {
    inputString += inputStdin;
});

process.stdin.on('end', _ => {
    inputString = inputString.trim().split('\n').map(string => {
        return string.trim();
    });

    main();    
});

function readLine() {
    return inputString[currentLine++];
}
/*
 * Create the function factorial here
 */
function factorial(n) {
    if (n === 1) {
        return 1
    } else {
        return n * factorial(n - 1)
    }
    return n;
}

function main() {
    const n = +(readLine());

    console.log(factorial(n));
}

Я разбил его на что-то вроде этого:

Будем зависеть n = 4;

4 === 1 ? // NO!
THEN:
4 * factorial(4-1) // n = 3;

3 === 1? // NO!
THEN:
3 * factorial(3-1) // n = 2;

2 === 1? // NO!
THEN:
2 * factorial(2-1) // n = 1;

1 === 1? // YES!
return 1;

Что происходит сейчас? Что происходит с возвратом 1 и что происходит со всеми другими «циклами» ?! И почему это l oop снова и снова, даже если нет l oop?

Пожалуйста, постарайтесь объяснить как можно проще.

1 Ответ

1 голос
/ 14 апреля 2020

Вот как выглядит ваш код (небольшое изменение сверху)

4 === 1 ? // NO!
THEN:
4 * factorial(2) // n = 3;

3 === 1? // NO!
THEN:
3 * factorial(2) // n = 2;

2 === 1? // NO!
THEN:
2 * factorial(1) // n = 1;

1 === 1? // YES!
return 1;

Когда выполняется return 1, 1 возвращается вызывающей функции factorial(1).

Теперь эта функция 2 * factorial(1) ожидает значения factorial(1), поэтому она может выполнить 2 * factorial(1). Теперь он делает 2 * 1 и дает вам 2. Это значение возвращается вызывающей функции factorial(2).

Тот же процесс 3 * factorial(2) // n = 2; ожидает factorial(2). Javascript решил эту проблему в предыдущей итерации, и теперь он может выполнить 3 * 2 = 6. Этот 6 возвращается вызывающей стороне factorial(3).

И, наконец, 4 * factorial(3) делает 4 * 6 = 24

И ваш ответ 24

Лучшее объяснение того, как все это работает за кадром

https://codeburst.io/learn-and-understand-recursion-in-javascript-b588218e87ea

...