递归生成指定长度字母排列问题求助:现有逻辑不符合预期
递归生成指定长度字母排列的修正方案
我来帮你搞定这个递归生成排列的问题~咱们先拆解下原代码的问题,再给出修正后的实现:
原代码的核心问题
- 没有累积当前排列:每次递归只单独输出一个字母,没办法把前面选的字母和后面的拼接成完整的串(比如AAA、AAB),最后输出的只是一堆零散的字母,完全不是目标排列。
- 终止条件逻辑错误:原代码在
n>0时循环,但当n=0(也就是凑够了指定长度的排列)时,没有输出已经构建好的序列,反而在每次循环结束后输出逗号换行,导致格式混乱。 - 依赖全局变量:函数参数写的是
alphabet,但循环里用的是全局的letters,虽然这里能运行,但函数的独立性和复用性很差。
修正后的递归实现
核心思路是在递归过程中传递当前已构建的字符串,当递归到n=0时,这个字符串就是一个完整的目标排列,直接输出即可。
var letters = ["A", "B", "C", "D", "E", "F"]; function myRekursion(alphabet, n, current = "") { // 终止条件:当n为0时,current就是凑够长度的排列,直接输出 if (n === 0) { // 这里可以根据需求调整输出格式,比如换行或加逗号 document.write(current + "<br>"); return; } // 遍历每个字母,作为当前位置的选择 for (var i = 0; i < alphabet.length; i++) { // 把当前字母追加到current后面,传递给下一层递归,同时n减1 myRekursion(alphabet, n - 1, current + alphabet[i]); } } // 调用函数,生成长度为3的所有排列 myRekursion(letters, 3);
代码解释
current参数:默认是空字符串,用来逐步拼接排列中的字母。比如第一次选"A",current变成"A";下一层递归再选"A",current变成"AA";再下一层选"A",current变成"AAA",这时n=0,就输出这个完整的排列。- 终止条件
n === 0:当n减到0,说明已经选够了指定长度的字母,直接输出current即可。 - 使用
alphabet参数:不再依赖全局变量,函数可以复用在其他字母列表上。 - 输出格式调整:如果想要用逗号分隔排列,把
document.write(current + "<br>");改成document.write(current + ", ");就行,要是想避免末尾多余的逗号,可以收集所有排列到数组里再统一输出。
兼容旧环境的版本
如果你的运行环境不支持ES6的默认参数,可以在调用时手动传入空字符串:
myRekursion(letters, 3, "");
内容的提问来源于stack exchange,提问作者Neil Woods
相关产品推荐
相关产品推荐

