Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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 如何生成n长度二进制字符串的所有可能状态?_Javascript - Fatal编程技术网

Javascript 如何生成n长度二进制字符串的所有可能状态?

Javascript 如何生成n长度二进制字符串的所有可能状态?,javascript,Javascript,这里有很多这样的问题,我知道,但我只是通读了其中的6个,它们主要涉及生成任意长度(a,b,c->a,ab,abc…)和/或仅提供的字符串或列表长度的字符集的所有组合 我试图弄清楚如何表示给定长度的所有可能的二进制字符串(以基数2编码),在阅读了所有关于这方面的问题后,我仍然很难弄清楚函数应该如何设计 我的目标是实现如下功能: var list = generateStates(3); // -> ['000', '111', '011', '001', '100', '110', '101

这里有很多这样的问题,我知道,但我只是通读了其中的6个,它们主要涉及生成任意长度(
a,b,c->a,ab,abc…
)和/或仅提供的字符串或列表长度的字符集的所有组合

我试图弄清楚如何表示给定长度的所有可能的二进制字符串(以基数2编码),在阅读了所有关于这方面的问题后,我仍然很难弄清楚函数应该如何设计

我的目标是实现如下功能:

var list = generateStates(3); // -> ['000', '111', '011', '001', '100', '110', '101', ... ]
棘手的部分是,我认为我需要在不使用递归的情况下执行此操作,因为我希望使用更长的二进制字符串来执行此操作,并且递归无法保持那么深(如果不超过最大调用堆栈)

一次尝试

从给定的n=3开始,取以下值

记住这一点,您可以通过添加一个值,从给定的组合生成下一个值。(或者,如果您获取一个数组,则执行一个
reduceRight
并构建一个新数组。)

函数生成属性(n){
var状态=[];
//转换成十进制
var maxDecimal=parseInt(“1”。重复(n),2);
//对于0->decimal之间的每个数字

对于(var i=0;我在末尾看到edit,我应该首先提到这一点。您的最大长度是多少(对于递归来说太长了?)问题到底出在哪里?通过添加一个状态,你可以很容易地从一个给定的状态生成下一个状态。@NinaScholz,这听起来很简单,我可能是个傻瓜,因为我不理解这一点,但我很难想象这是如何实现的。似乎不仅仅是每次添加。你能展示它吗?@Tor可能是300-400长度块。但我认为,这总计超过100K个递归深度,对吧,还是我错了?这在Node.js中抛出了一个内存不足的错误,生成一个300长度二进制字符串的所有组合是否太多而不可行?我认为它只是~100K个组合。似乎可行。300长度二进制是不是太多了字符可以有两个值(0或1),那么这相当于2^300个组合,大约是10^90。这比已知宇宙中的原子还要多。@Vizi,你的估计只差几个数量级。一个长度为
n
的二进制数字串的可能值的数量是2^n。所以2^300大约是2.037*10^90。re:Viz,我想它实际上是m任何比这高出许多的数量级。到第20代时,你已经有了1048576个不同的组合。@8小树哦,妈的,我在想,因为它只是一个2字符集,它应该是300^2。我的数学太差了:P
binary  decimal
------  -------
  000       0
  001       1
  010       2
  011       3
  100       4
  101       5
  110       6
  111       7
function generateStates(n){
  var states = [];

  // Convert to decimal
  var maxDecimal = parseInt("1".repeat(n),2);

  // For every number between 0->decimal
  for(var i = 0; i <= maxDecimal; i++){
    // Convert to binary, pad with 0, and add to final results
    states.push(i.toString(2).padStart(n,'0'));
  }

  return states;
}