【问题标题】:How to generate all possible strings, with all ascii chars, to a certain length如何使用所有 ascii 字符生成所有可能的字符串到一定长度
【发布时间】:2019-05-10 14:48:53
【问题描述】:

我今天有点挣扎,试图创建一个函数,它可以生成所有可能的字符串,所有可能的 ascii 字符,直到一定长度。

所以基本上,首先是一个字符,从 0 到 255。然后是两个,我得到 AA,然后是 AB,然后是 AC... 等等(但使用 ascii 字符代码来获取每个位置的所有可能值)。
这有意义吗?

我想我不擅长递归,因为我所做的每一次尝试,要么变得太复杂以至于我自己无法弄清楚,要么最终只会增加字符串中的最后一个位置。

我完全被困在这里,失去了对我正在做的事情的所有概述。
我试过谷歌搜索无济于事,通常会出现在看起来不太相同的相同文章中。

我会对任何示例感到满意,它不必是 javascript。

帮我stackoverflow,你是我唯一的希望。

【问题讨论】:

  • 如果您真的想要所有 256 个代码,为什么要从 AA 而不是 A\0 开始?请注意,ASCII 仅从 0 变为 127。还是您实际上只想要 26 个大写字母?
  • 我确实想从 chr(0) 开始,我只是认为 AA 会是一个更容易编写的示例。
  • 好的,如果你想从0 转到255,最好是讨论“字节序列”而不是“ascii 字符串”

标签: javascript node.js recursion


【解决方案1】:

您可以使用生成器,递归地构建字符串并将结果生成给调用者:

  function* chars() {
    for(let i = 0; i < 255; i++) 
      yield String.fromCharCode(i);
  }

 function* combinations(length, previous = "") {
   if(length <= 0) {
      yield previous;
      return;
   }

   for(const char of chars())
      yield* combinations(length - 1, previous + char);
}

这样你就可以得到所有的组合:

  const result = [...combinations(5)];

请注意,255 ** n 很多,因此您可能希望一个接一个地使用这些组合:

  const timer = ms => new Promise(res => setTimeout(res, ms));

  (async function() {
     for(const combo of combinations(5)) {
       console.log(combo);
       await timer(1);
     }
 })();

【讨论】:

  • 我建议在 for 循环之外执行递归基本情况条件...
  • 请注意,promise 是在微任务上的,所以await tick()(基本上等同于await;)仍然会阻塞事件循环。最好每隔几千个连击就做await new Promise(r =&gt; setTimeout(r, 1));
  • 这是一个绝妙的解决方案。真好看。谢谢你。有一件事我不太明白,也许是因为生成器。在任何时候,如果我出于任何目的使用 combo.length,它将是最大设置长度(示例中为 5),而不是实际字符串的长度。这是为什么呢?
  • @nicolai 不是实际结果字符串的长度吗?
【解决方案2】:

我想我不擅长递归

您似乎正在寻找递归解决方案。

这个伪代码能解决你的问题吗?

F(n)
    if (n == 1)
        return asciiCharacters

    suffixes = F(n - 1)

    for each character of asciiCharacters
        for each suffix of suffixes
            results.push(character + suffix)

    return results

asciiCharacters 是一个 ASCII 字符数组。

【讨论】:

    猜你喜欢
    • 2012-02-28
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2015-11-27
    • 2016-02-07
    • 1970-01-01
    • 2021-02-09
    相关资源
    最近更新 更多