繁体   English   中英

for循环内的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM