Javascript返回所有数字的组合

javascript return all combination of a number

本文关键字:组合 数字 返回 Javascript      更新时间:2023-09-26

我试图得到一个数字的所有组合。例如,输入"123"应该返回["123", "231", "213", "312", "321", "132"]

下面是我的函数:

function swapDigits(input) {
    for (var i = 0; i++; i < input.length - 1) {
        var output = [];
        var inter = input.slice(i, i + 1);
        var left = (input.slice(0, i) + input.slice(i + 1, input)).split("");
        for (var j = 0; j++; j <= left.length) {
            var result = left.splice(j, 0, inter).join("");
            output.push(result);
        }
    }
    console.log(output);
    return output;
}

然而,这个函数返回undefined,谁能告诉我出了什么问题?

for环和scope环的误差已经提到。除此之外,splice方法将改变它所操作的字符串。这意味着内循环永远不会终止,因为left一直在增长,所以j永远不会达到left.length

如果你是一门语言的新手,我建议你从接近你想要实现的算法的实现开始。然后,一旦你适应了它,就可以使用更高级的语言结构。

参见this fiddle的示例。这是算法代码:

function getPermutations(input)
{    
    if(input.length <= 1)
    {
        return [input];
    }
    var character = input[0];
    var returnArray = [];
    var subPermutes = getPermutations(input.slice(1));
    debugOutput('Returned array: ' + subPermutes);
    for(var subPermuteIndex = 0; subPermuteIndex < subPermutes.length; subPermuteIndex++ )
    {
       var subPermute = subPermutes[subPermuteIndex];
       for(var charIndex = 0; charIndex <= subPermute.length; charIndex++)
       {                         
           var pre = subPermute.slice( 0, charIndex );
           var post = subPermute.slice( charIndex );             
           returnArray.push(pre+character+post);           
           debugOutput(pre + '_' + character + '_' + post );
       }
    }
    return returnArray;
}

基本上,这将遍历到字符串的末尾,并返回构造子字符串的所有排列。从1234的调试输出中最容易看出这一点。请注意,'Returned array'指的是由子字符串的排列创建的数组。还要注意,当前字符被放置在该数组中的每个位置。当前字符显示在_之间,如432_1_中的1

Returned array: 4
_3_4
4_3_
Returned array: 34,43
_2_34
3_2_4
34_2_
_2_43
4_2_3
43_2_
Returned array: 234,324,342,243,423,432
_1_234
2_1_34
23_1_4
234_1_
_1_324
3_1_24
32_1_4
324_1_
_1_342
3_1_42
34_1_2
342_1_
_1_243
2_1_43
24_1_3
243_1_
_1_423
4_1_23
42_1_3
423_1_
_1_432
4_1_32
43_1_2
432_1_

这个算法不强制唯一性。所以,如果你有一个字符串22,那么你将得到两个结果——22,22。同样,这个算法使用递归,我认为在这种情况下是很直观的,但是如果你寻找的话,也有纯迭代实现。

代码中有几个错误。

  1. 您的for语句的部分顺序不正确。顺序是初始化测试增量。所以for (/* init */ ; /* test */ ; /* increment */)

  2. 你正在为你的外部循环的每次迭代创建一个新的数组。

我将此定义为CW,因为我没有检查除上述错误之外的其他错误。