排列,递归

时间:2011-03-25 22:54:40

标签: java recursion permutation

我有一个任务:用户输入一个字符串,例如ABCD,程序必须输出所有排列。 我不希望整个代码只是一个提示。这是我到目前为止所得到的,我什么都没有实现。

以ABCD为例:

在这种情况下得到String的长度为4! = 24。

24/4 = 6所以第一封信必须在6之后改变。到目前为止一直很好。

得到三个剩余字母的阶乘3! = 6.

6/3 =每个字母2个2个位置。从这里我不知道如何继续填补24个地方。

使用这个算法我只有

ABCD

ABD

AC

AC

AD

AD

。 (继续6 C和6 D)

我认为我的问题是我没有很多关于递归问题的经验,所以谁可以建议一些程序来帮助我更好地了解递归问题。

谢谢!如果有些事情不清楚请指出。

2 个答案:

答案 0 :(得分:4)

你是正确的,递归是要走的路。你通过一点点数学工作的例子都是正确的,但有点间接。

这是一些伪代码:

 def permute(charSet, soFar):
     if charSet is empty: print soFar //base case
     for each element 'e' of charSet:
         permute(charSet without e, soFar + e)  //recurse

部分递归树的示例

                      permute({A,B,C}, '')
                   /           |           \
 permute({B,C}, 'A')  permute({A,C}, 'B')   permute({A,B}, 'C')   
                          /          \
               permute({A}, 'BC')    permute({C}, 'BA')
                       |
               permute({}, 'BCA')<---BASE CASE, print 'BCA'

修改

处理重复的字符而不重复任何排列。让unique成为一个函数,用于从集合中删除任何重复的元素(或者通过索引将字符串视为有序字符集)。

1)存储结果(包括欺骗),然后将其过滤掉

 def permuteRec(charSet, soFar):
     if charSet is empty: tempResults.add(soFar) //base case
     for each element 'e' of charSet:
         permute(charSet without e, soFar + e)  //recurse

 global tempResults[]

 def permute(inString):
     permuteRec(inString, '')
     return unique(tempResults)

 print permute(inString)

2)避免首先产生重复

 def permute(charSet, soFar):
     if charSet is empty: print soFar //base case
     for each element 'e' of unique(charSet):
         permute(charSet without e, soFar + e)  //recurse

答案 1 :(得分:0)

创建一个带字符串的方法。

从字符串中选取一个字母并输出。

使用输入字符串减去您选择的字母创建一个新字符串。

如果新字符串至少包含1个字符

,则使用新字符串调用上述方法

为每个可能的字母选择一个字母。