首页 > 解决方案 > if 语句为真时会发生什么?

问题描述

我从 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 发生了什么,所有其他“循环”发生了什么?!为什么它会一遍又一遍地循环,即使没有循环?

请尝试尽可能简单地解释。

标签: javascriptloopsfor-loopif-statement

解决方案


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

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


推荐阅读