关于数学因子的Javascript代码

时间:2015-07-06 21:02:23

标签: javascript math

我正在读这本关于JavaScript的书,它有关于计算数学因子的练习。好吧,它以一种有趣的方式呈现,其中代码必须打印出一个单词(在这种情况下为“clunk”),它打印出来的时间取决于在调用函数时作为参数传递的数字。

在此示例中,数字为5,因此您可以总共进行120次组合(5x4x3x2x1)。

问题是我很难理解代码中的逻辑。这是:

function clunk(times) {
    var num = times;
    while (num > 0) {
        display("clunk");
        num = num - 1;
    }
}

function thingamajig(size) {
    var facky = 1;
    clunkCounter = 0;

    if (size === 0) {
        display("clank");

    } else if (size === 1) {
        display("thunk");

    } else {
        while (size > 1) {
            facky = facky * size;
            size = size - 1;
        }
        clunk(facky);
    }
}

function display(output) {
    console.log(output);
    clunkCounter = clunkCounter + 1;
}

var clunkCounter = 0;
thingamajig(5);
console.log(clunkCounter);

我阅读完代码后的理解是,“clunk”这个词会被打印5次,然后是4次,然后是3次,2次和1次,共计15次,因为我认为每次通过循环都会被添加,不成倍增加。 我没有在代码中看到为什么第一个循环要乘以第二个循环,依此类推,直到达到1?

2 个答案:

答案 0 :(得分:5)

目前,代码打印clunk 120次。函数clunk()将打印单词clunk多次等于其第一个参数。 else thingamajig条款计算了您提供的数字的阶乘:

while (size > 1) {
    facky = facky * size;
    size = size - 1;
}

使用您的输入5展开,将执行:

facky = 1;
size = 5;

facky = facky * 5;  // Now facky = 5
size = 5 - 1;       // Now size = 4

facky = facky * 4;  // Now facky = 20
size = 4 - 1;       // Now size = 3

facky = facky * 3;  // Now facky = 60
size = 3 - 1;       // Now size = 2

facky = facky * 2;  // Now facky = 120
size = 2 - 1;       // Now size = 1, we stop our while loop

然后调用clunk(facky),其值为120,为我们提供当前输出。

如果要打印15次 - 使用您提供的逻辑 - else的{​​{1}}条款将会是这样的:

thingamajig

答案 1 :(得分:1)

我建议运行代码,最好使用调试器。您将看到“clunk”显示120次。注意,函数clunk只被调用一次,它在循环之外。

因此循环计算facky(1 * 5 * 4 * 3 * 2 = 120)然后循环退出。使用参数120调用函数clunk