【问题标题】:What happens with the if statement when it's true?if 语句为真时会发生什么?
【发布时间】:2020-04-14 18:19:26
【问题描述】:

我从 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;

现在会发生什么? return 1 发生了什么,所有其他“循环”发生了什么?!为什么它会一遍又一遍地循环,即使没有循环?

请尽量简单地解释。

【问题讨论】:

    标签: javascript loops for-loop if-statement


    【解决方案1】:

    这是您的代码的样子(上面稍作修改)

    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

    【讨论】:

    • 感谢您的回复,但我没明白:(
    • @minternational 对不起,如果我的解释不清楚你可以在这里阅读更好codeburst.io/…
    • 我不认为你的解释缺乏质量 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多