[英]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.