首页 > Javascript代码调试死循环?

Javascript代码调试死循环?

正在做一道求[min, ..., max]的数字列表的最小公倍数LCM的题,我的思路是先求出列表中前两个数ab的最大公约数GCD,然后由公式LCM = a * b / GCD得到最小公倍数,再求前两个数的最小公倍数和第三个数的最小公倍数,以此类推至最后一个数:

array = [12, 24, 36];
GCD(12, 24) = 2;
//LCM = a * b / GCD
LCM(12, 24) = 24;
LCM(LCM(12, 24), 36) = 72;
LCM(12, 24, 36) = 72;

Code:

function smallestCommons(arr) {
  
  var max = arr[arr.length-1];
  var num = [];
  
  // Get the Numlist of min to max
  for(var min=arr[0],i=0; i<max; i++){
    num[i] = min;
    min++;
  }
  
  // Function of GCD
  function gcd(a, b) {
    var tmp;
    while(tmp !== 0) {
      tmp = a % b;
      a = b;
      b = tmp;
    }
    return a;
  }
      
  // Function of LCM
  function lcm(a, b) {
    var mult = a * b;
    return mult / gcd(a, b);
  }
  
  // Get the LCM of the number list
  var len = num.length;
  var x = num[0];
  for (var j = 0; j < len; j++) {
    var NextNum = num[j+1];
    var tmp = lcm(x, NextNum);
    x = tmp;
  }
  return x;
}
  
smallestCommons([1,5]);

在Pythontutor上调试的时候,在出错的前一步可以看到函数结果得到了LCM(1, 2, 3, 4, 5) = 60,但是无法返回结果并且在GCD函数的while循环出现死循环,找不出原因。
学编程不久,代码格式和思路都比较乱,前辈们有什么意见尽管指出,谢谢。


  for (var j = 0; j < len; j++) {
    var NextNum = num[j+1];
    var tmp = lcm(x, NextNum);
    x = tmp;
  }

问题出在这里。你应该写

  for (var j = 【1】; j < len; j++) {
    var NextNum = num[【j】];
    var tmp = lcm(x, NextNum);
    x = tmp;
  }

你的那种写法,到了j==len-1的时候,NextNum是undefined,然后你就死循环了。

为了能够在将来熟练地指出这样的错误,请背诵Javascript真值表(贴出来的只是冰山一角):

==

===

if

【热门文章】
【热门文章】