我是新手,我不确定如何正确地提出这个问题。
我试图打印出可能完成表达的最少数量的元素。例如,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);
答案 0 :(得分: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开始,然后从那里开始工作。
答案 1 :(得分:1)
如果你想要完成每一轮,如果我理解你的目的,就不能嵌套它们。
另外,将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]