2017-06-29 77 views
0

無法檢測到錯誤。無限循環在哪裏發生?

// JavaScript Document 
 
var person = prompt("GIVE INPUT", ""); 
 
var count = 0; 
 
var array = person.split(","); 
 
var freq = []; 
 
var words = []; 
 

 
//freq.fill(0); 
 
//words.fill(""); 
 
//window.alert(freq[0]); 
 

 
var i = 0, j = 0; 
 
while (array.length > 0) { 
 
    var temp = array[0]; 
 
    while (j < array.length) { 
 
     if (temp == array[j]) { 
 
      count = count + 1; 
 
      array.splice(j, 1); 
 
      //console.log(array); 
 
      j = 0; 
 
     } 
 
     else { 
 
      j = j + 1; 
 
     } 
 
    } 
 
    freq[freq.length] = count; 
 
    count    = 0; 
 
    words[words.length] = temp; 
 
} 
 
window.alert(freq + "\n" + words);

的問題是,每當我運行出現一個無限循環,並表示,我無法找到錯誤請儘可能幫助沒有輸出。此代碼用於查找輸入字符串中的單詞的頻率,用逗號分隔單詞。謝謝你。

+0

什麼是你的腳本,該怎麼辦? – j08691

+1

在調試器中逐句通過代碼總是有用的。你會很容易地知道發生了什麼。 –

+0

計算字符串中用逗號分隔的單詞的頻率 - @ j08691 – Vishal

回答

0

你只需要把var i=0,j=0;放在while裏面!

while(array.length>0) 
{var i=0,j=0; 

Working fidddle

+0

謝謝。我做了這樣一個愚蠢的錯誤。有時它不可檢測。很多人。 :) – Vishal

0

您在每次迭代中將循環變量j重置爲0。這個條件if(temp==array[j])永遠不會失敗,所以j總是重置爲0,所以while(j<array.length)永遠是真的。

+0

但我正在應用array.splice這是減少數組的大小,因此長度將一次變爲0,然後循環應結束 – Vishal

0

出來的內部While循環後,您需要重置j爲零。由於j的增量值不允許它再次進入內部循環所以array.length沒有減少而且我們正在發生無限循環。

// JavaScript Document 
 
    var person = prompt("GIVE INPUT", ""); 
 
    var count=0; 
 
    var array = person.split(","); 
 
    var freq = new Array(); 
 
    var words = new Array(); 
 
    //freq.fill(0); 
 
    //words.fill(""); 
 
    //window.alert(freq[0]); 
 
    var i=0,j=0; 
 
    while(array.length>0) 
 
    { 
 
\t var temp=array[0]; 
 
\t while(j<array.length) 
 
\t { 
 
\t \t if(temp==array[j]) 
 
\t \t { 
 
\t \t  \t \t count=count+1; 
 
\t \t \t \t array.splice(j,1); 
 
\t \t \t \t //console.log(array); 
 
\t \t  \t \t j=0; 
 
\t \t } 
 
\t \t else 
 
\t \t { 
 
\t \t \t \t j=j+1; 
 
\t \t } 
 
\t \t 
 
\t } 
 
\t freq[freq.length]=count; 
 
\t count=j=0; 
 
\t words[words.length]=temp; 
 
    } 
 
    window.alert(freq+"\n"+words);

+0

非常感謝。但我不能接受你的答案,因爲事先由上面的人回答。 ty :) – Vishal

0

這也正是是一致性更爲有用。您可以爲循環替換內循環這個

for(j=a.length-1; j>=0; j--) 
    if(temp==a[j]) { 
     count=count+1; 
     a.splice(j,1); 
    } 

然而,從總體的統計方法的複雜性可以與數據結構像地圖縮小。
腳本的基本組成部分,可以減少這樣:

var counter = new Map(); 
for (i in array) 
    counter.set(array[i], (counter.get(array[i])||0)+1); 
var freq = Array.from(counter.values()); 
var words = Array.from(counter.keys());