Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串双循环的组合(JavaScript)_Javascript_Loops_Combinations - Fatal编程技术网

字符串双循环的组合(JavaScript)

字符串双循环的组合(JavaScript),javascript,loops,combinations,Javascript,Loops,Combinations,我试图理解如何使用双循环找到字符串的所有组合,但我遇到的解决方案太复杂,无法理解。该函数满足我的需要,但我对设置单for循环或双for循环有初学者理解 我希望对正在发生的事情有一个循序渐进的一般性解释,但具体问题是:什么函数是“I

我试图理解如何使用双循环找到字符串的所有组合,但我遇到的解决方案太复杂,无法理解。该函数满足我的需要,但我对设置单for循环或双for循环有初学者理解

我希望对正在发生的事情有一个循序渐进的一般性解释,但具体问题是:什么函数是“I<Math.pow(2,n)-1”,“((I&(1 这正是您所认为的—存储在for循环执行其任务时填充的日志


至于
(i&(1Math.pow)是一个幂函数。第一个参数是基,第二个参数是指数,因此Math.pow(2,n)等于2^n。在循环中,
i
意味着for循环的边界是i小于2^n,其中n是字符串长度


var comb='';
正在初始化一个空字符串。此字符串稍后在循环中连接,因此此声明用于建立用于连接的变量。

要获得字符串的随机组合,我们可以设置一个布尔数组,存储是否应显示其中一个字符,例如:

"a","g","e"
[true,false,true]
=>"ae"
因此,可能的变化数量是

2 /*true/false*/ ** str.length 
用旧式书写:

Math.pow(2,str.length)
因此,主for循环迭代所有可能的组合,除了第一个(如我从1开始),因为这将是一个空字符串,最后一个(-1)将是“age”。虽然我是一个简单计数的整数,但我们也可以想象它是一个布尔数组(在按位视图中):

这就转化为

"ae"
按位显示:

真正的一个(“A”):

101//i

&001//1这是一个基于二进制(0/1)的代码
解释请修复格式。00101(二进制)=0*2^4+0*2^3+1*2^2+0*2^1+1*2^0=0+0+1*4+0+1*1=5是不可理解的不幸的是,我对这些几乎不太了解,无法解释它们:(,至少你是诚实的,+1;)你的输出顺序是错误的。这一定是一个令人激动的解释乔纳斯:)我刚刚掌握了数字是如何用位和大O(2^n-1)二叉树分支选项来表示和操作的概念。如果没有按位操作和I<2^n-1“断点”,那么“更高级别”的双循环会是什么样子?比如“由于输入中有3个字符,所以I<6个循环”“var use”使用某种非位逻辑表达式。你明白我的意思吗,就像第二周的javascript双循环回答这个问题一样?通过连接,你是指comb concat的a到e使“ae”作为整个结果的一部分输出,还是它concat的(或保持/收集)循环查找组合时的结果集合,例如“a ag ae g ge e”输出到控制台?@springathing第一个
Math.pow(2,str.length)
integer
bits
boolean array

1
001
[false,false,true]

2
010
[false,true,false]

3
011
[false,true,true]

4
100
[true,false,false]

... 
6 < 2 ** 3 -1
110
[true,true,false]
for (var j=0; j<n; j++) {
  var use = ((i & (1 << j)) == 1 << j);
  if(use)comb+=str.charAt(j);
}
[true,false,true]//101
"ae"
 101 // i
&001 //1<<j where j is 0
=001
===
 001 //1<<j
 101
&010 //1<<j where j is 1
=000
!==
010 //1<<j
 101 // i
&100 //1<<j where j is 2
=100
===
 100 //1<<j
 if(i & (1<<j))
For "a" the beginning is 
 var n = str.length; // 1
for (var i=1; i< Math.pow(2,n)-1; i++) { // for i=1;i<2^1-1 =2-1=1;i++
var comb = '';
for (var j=0; j<n; j++) {//for j=0;j<1;j++
var use = ((i & (1 << j)) == 1 << j);// use = 1 & (1 << 0 insert 0 times 0)) == 1 << 0= (1 & 1)== 1=true (1==1)
if(use)comb+=str.charAt(j);//comb='' + a.charAt(0)=  comb= '' + "a"='a'
               = 0     + 0     + 1*4   + 0     + 1*1

               = 5 in current using (decimal)