簡體   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