
[英]recursive function that calls recursion inside for loop in javascript
[英]Javascript recursive function inside a for loop
var f_drum_min = function myself(a){
alert(a);
$f_min_node.push(a);
for (i=0;i<=$m;i++){
if ($f_leg[i][1]==a){
myself($f_leg[i][0]);
}
}
};
myself($f_leg[i][0]);
中断for
循环,如何使其在循环中多次运行?
您的功能充斥着不良习惯
我无法改善此功能,因为我不知道所有这些外部状态会做什么。 它们的数据类型是什么也不立即可见。
这些坏习惯,因为有知道你的函数的效果没有可能的方式。 它唯一的输入是a
,但函数取决于$f_min_node
, $f_leg
和$m
。
调用函数时这些变量的值是多少?
还有哪些其他功能可以更改这些值?
我$f_min_node
分配$f_min_node
一些值,然后称为f_drum_min
。 我应该怎么知道$f_min_node
会被更改?
每次调用函数时,结果都会令人惊讶。 这些是编写不确定性(“不纯正”)函数的麻烦。
在您解决这些问题之前,以最少的担心进行循环循环
我在这里用注释注释了您的代码
// bad function naming. what??
var f_drum_min = function myself(a){
// side effect
alert(a);
// external state: $f_min_node
// mutation: $f_min_node
$f_min_node.push(a);
// leaked global: i
// external state: $m
for (i=0;i<=$m;i++){
// external state: $f_leg
// loose equality operator: ==
if ($f_leg[i][1]==a){
myself($f_leg[i][0]);
}
}
};
我可以帮助您编写使用线性迭代过程的确定性递归函数。 最重要的是,它不依赖于任何外部状态,也不会改变输入。
// Number -> Number
var fibonacci = function(n) {
function iter(i, a, b) {
if (i === 0)
return a;
else
return iter(i-1, b, a+b);
}
return iter(n, 0, 1);
}
fibonacci(6); // 8
for
循环非常原始; 势在必行的程序员几乎会立即想到这是解决迭代问题的唯一方法。
我可以在此函数中使用for
循环,但是以不同的方式考虑问题可以使我用不同的方式表达它,并完全避免使用for
循环。
该代码的一个基本问题(几乎在任何情况下都可能导致该代码中断)是循环变量i
是全局变量,因此该函数的所有递归调用都将其共享。
例如,假设该函数是第一次调用。 i
为0。现在它递归,让我们说if
中的条件永远不会为true
。 在第二次通话结束时, i = $m + 1
。 当您返回第一个电话时,由于i
是全局的,因此第一个电话中的循环结束。 我认为这不是您想要的。
解决方法是将i
声明为local:
for (var i=0;i<=$m;i++){
这可能会或可能不会解决您所有的问题(如注释中所指出,我们必须查看您的更多代码以识别所有可能的问题),但这是关键的第一步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.