我必须编写一个程序,给出一个数字的所有permutatioms。例如,用户输入数字4.我必须返回数字1,2,3,4的所有可能组合。我遇到了一个获得所有排列的好方法的问题。我有它所以我的程序将数字1-n放在一个数组中。但是,我想不出一个很好的排列方式。我知道我需要使用递归,但我的问题是首先获得排列的方法。我知道转换数字可能是最好的方法,但这样做的最佳方法是什么?
答案 0 :(得分:3)
理解算法的最简单方法是这样。要获得1到4的所有排列,您需要
这是一个相当标准的递归。对于每个数字,递归查找其他数字的所有排列,并在开头添加此数字。
答案 1 :(得分:2)
我们可以简单地使用recursion
通过递归选择一个元素然后将递归应用于该数组的子集来获得可能性。这是数字1到3的示例
答案 2 :(得分:0)
递归是你的朋友。如果你有一个元素,你的解决方案显然是[[1]]。对于两个元素,你可以把你所有的"一个" -solutions(好吧,只有一个)并在1之前或之后坚持2,所以得到[[2,1],[1] ,2]]。对于三个要素,请选择所有"两个"解决方案并将三者放在第一,第二或第三位置。从[2,1]得到[3,2,1],[2,3,1]和[2,1,3]。从[1,2]得到[3,1,2],[1,3,2]和[1,2,3]。总之,你的解决方案是[[3,2,1],[2,3,1],[2,1,3],[3,1,2],[1,3,2],[1, 2,3]]。
答案 3 :(得分:0)
请注意chiastic-security's algorithm如何生成n个数字的所有排列依赖于能够生成n-1个数的所有排列?要使用他的算法,我们所需要的只是能力,还有一件事:一种生成只包含一个数字的集合的所有排列的方法。
生成单个数字的所有排列是微不足道的:只有一个,仅由该数字组成。
另一项要求是什么 - 能够生成n-1个数字的所有排列?这似乎更难,但事实证明并非如此。假设我们要解决的问题n = 2:然后n-1 = 1,然后我们就可以了,因为我们知道如何生成1个数的所有排列。因此,在这里应用chiastic-security算法为我们提供了一种生成2个数字的所有排列的方法。如果我们要解决的问题是n = 3,那么n-1 = 2,我们刚刚确定我们可以生成2个数的所有排列,所以我们仍然可以 - 我们知道如何生成所有3个数字的排列。如果n = 4,则n = 3 = 3,我们刚刚确定我们可以生成3个数的所有排列,因此我们也可以生成4个数的所有排列。显然,这种推理可以永远持续下去 - 因此您可以通过这种方式生成任意数量的所有排列。
这种推理是非正式的,但可以使用mathematical induction完全准确。如果可以应用归纳,那么令人惊讶的结果是我们永远不必解决“艰难的”任何“大”问题 - 我们总是可以将它们分解成一个或多个小问题,这些问题又可以被打破更小的问题,直到达到一个或多个易于解决的“基本案例” - 然后解决更大的问题可以从这些解决方案拼凑到更简单的子问题。