2017-06-29 87 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());