[英]Counting how many times a function has been called recursivly in JS
我有一个作业,应该在JavaScript中编写一个伪随机数生成器。 这是我写的代码位
var k = 0;
var slump = function(n, k) {
if (k < 10) {
console.log("stop");
}
else {
k++;
console.log((5*n + 1) % 8);
return slump((5*n + 1) % 8, k);
}
};
slump(0);
k应该保留函数被调用的次数。 但是,它不会一直运行十次,而是会继续运行。 有什么办法可以解决这个问题?
根据您想获得的惯用和聪明程度,这里有两个细微不同的选项。
由于JS不支持默认参数,因此需要稍作调整的经典实现将使用以下方法:
var finalDepth = 0;
function slump(n, k) {
k = k || 0; // Set to 0 if falsy (null, undef, or 0)
if (logic) {
finalDepth = k; // Record the depth on the last call
} else {
return slump((5*n + 1) % 8, k + 1);
}
}
这将非常简单地记录堆栈最深的位置,并将其挂起,直到下一次调用为止。
如果您想更像JS,可以使用闭包来跟踪调用:
function createGenerator() {
var counter = 0;
return {
slump: function (n) {
++counter; // Closure captures counter, counter persists between slump calls but is unique for each createGenerator
if (logic) {
// stop
} else {
return slump((5*n + 1) % 8, k + 1);
}
},
getCounter: function () { return counter; }
}
}
您也许可以使用ES6迭代器 (或生成器)的某些功能来使其更加巧妙。
每当编写递归函数时,都需要确保:
console.log
语句运行时) 您在第二部分遇到问题; 您增加k,但是并不能使您更接近k < 10
的部分。 简而言之,您可能希望切换该测试,并确保最初使用正确数量的参数调用该函数。 (Aadit M Shah 指出您正在用一个来调用它,并且期望它是两个,这意味着当您调用它时它最终未定义。)
无论哪种方式,迭代在这里肯定会更好地工作:
var n = 0;
for(var i = 0; i < 10; i++) {
n = (5 * n + 1) % 8;
console.log(n);
}
功能参数k
未初始化,因此不是数字。 这尤其意味着终止测试k < 10
失败,并且k++
语句不会更改k
的值。 因此,总是以相同的参数k
值调用坍落度,并且递归永远不会停止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.