【问题标题】:How can I "complete" a loop before moving on to the nested loop?在进入嵌套循环之前如何“完成”一个循环?
【发布时间】:2017-05-11 23:51:21
【问题描述】:

我是新手,不知道如何正确地问这个问题。

我正在尝试打印出尽可能少的元素来完成一个表达式。例如,8 的一位等于 1 (2^3),所以我希望这个函数只打印 1。但是,该函数打印三位等于 1 (2^2 + 2^0 + 2^0) .我明白为什么;这是因为在完成外循环之前,外循环会继续进入嵌套循环,但我不知道如何重新排列这些循环以完成第一个循环,然后再检查下一个循环。

var array = [];  
var countBits = function(n) {

    for (i=0;i<=n;i++){
        if (Math.pow(2,i) === n){
            array.push(i);
            return array;
        } 
        for (j=0;j<=n;j++){
            if (Math.pow(2,i) + Math.pow(2,j) === n){
                array.push(i,j);
                return array;
            }
            for (k=0;k<=n;k++){
                if (Math.pow(2,k) + Math.pow(2,j) + Math.pow(2,i)===n){
                    array.push(k,j,i);
                    return array;
                }
            }
        }
    }
}

countBits(8);

console.log(array);

console.log(array.length);

【问题讨论】:

  • 对不起,您的解释很混乱!我不知道你想完成什么!能不能做个算法,一步一步解释
  • 我想我知道发生了什么事......给我一分钟

标签: javascript arrays loops for-loop


【解决方案1】:

尝试翻转for循环方向

var array = [];  
var countBits = function(n) {

  for (i=n;i>=0;i--){
        if (Math.pow(2,i) === n){
            array.push(i);
            return array;
        } 
        for (j=n;j>=0;j--){
            if (Math.pow(2,i) + Math.pow(2,j) === n){
                array.push(i,j);
                return array;
            }
            for (k=n;k>=0;k--){
                if (Math.pow(2,k) + Math.pow(2,j) + Math.pow(2,i)===n){
                    array.push(k,j,i);
                    return array;
                }
            }
        }
    }
}

countBits(8);

console.log(array);

console.log(array.length);

这与 for 循环的顺序无关,而是与它找到答案的方式有关。你想从尽可能大的 n 开始,然后从那里开始。

【讨论】:

  • @Shawn 我不知道,我没有仔细研究它,但我认为这是因为[2,1,1] 包含的数字低于[3] 中的数字
【解决方案2】:

如果你想完成每一轮,你不能嵌套它们,如果我理解你的目的。

另外,将var i, j, k, arr = [] 声明为函数内部的变量,并让它始终返回数组。

var countBits = function (n) {
  var i, j, k, arr = [];
  for (i = 0; i <= n; i++) {
    if (Math.pow(2, i) == n){
      arr.push(i);
      return arr;
    }
  }
  for (i = 0; i <= n; i++) {
    for (j = 0; j <= n; j++) {
      if (Math.pow(2, i) + Math.pow(2, j) == n){
        arr.push(i, j);
        return arr;
      }
    }
  }
  for (i = 0; i <= n; i++) {
    for (j = 0; j <= n; j++) {
      for (k = 0; k <= n; k++) {
        if (Math.pow(2, i) + Math.pow(2, j) + Math.pow(2, k) == n){
          arr.push(i, j, k);
          return arr;
        }
      }
    }
  }
  return arr;
};

var array = countBits(8);

console.log(array.length+":", array); // 1: [3]

【讨论】:

  • 谢谢,这很有意义。我想我的方法是蛮力的,因为我是新手,但我想这样做只是为了掌握自己找出算法的窍门。
  • 如果@Isaac 的解决方案如您所愿适用于所有情况,它可能比我的更有效,因为它减少了尝试次数,但我不确定它是否给出相同的结果。无论如何,不​​要忘记在我的回答中声明函数内部的变量。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多