我正在读这本关于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?
答案 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
。