数组 – 在没有for循环的情况下查找数组的排列

我在LinkedIn组
here上看到了这个采访问题

总结一下,如果我有一个数组

[1,2,3,4,5]

和输入

3

我需要输出

[1,2,3], [3,2,1], [2,3,1], [2,1,3], [1,3,2], [3,1,2], [2,3,4], [4,3,2],...

没有特别的顺序.

我一直在考虑这个问题.我提出了各种不同的解决方法,但所有方法都使用for循环.

我认为很明显,为了消除循环,它必须是递归的.

我认为我已经接近这个递归分区数组和连接元素,但非常沮丧我最终需要另一个for循环.

我开始认为这是不可能的(它不可能,否则为什么面试问题?).

任何想法或链接?可能的输出量应为5PN,其中N为输入.

最佳答案 以下递归算法将尝试打印{1,..,n}的每个子集.这些子集通过以下双射一对一地具有0到2 ^ n-1之间的数字:对于0到2 ^ n-1之间的整数x,如果x的第一位设置为0,则关联包含1的集合一,如果x的第二位设置为1,则为2,…

void print_all_subsets (int n, int m, int x) {
    if (x==pow(2,n)) {
        return;
    }
    else if (x has m bits set to one) {
        print the set corresponding to x;
    }
    print_all_subsets(n,m,x+1);
}

您需要使用n = 5(在您的情况下),m = 3(在您的情况下)和x = 0来调用它.

然后你需要实现两个函数“打印对应于x的集合”和“x有m位设置为1”而不用for循环…但这很容易使用再次递归完成.

但是,我认为这更具挑战性 – 完全消除for循环没有意义,只有以聪明的方式使用它们才有意义.

点赞