我有一个任务:用户输入一个字符串,例如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)
我认为我的问题是我没有很多关于递归问题的经验,所以谁可以建议一些程序来帮助我更好地了解递归问题。
谢谢!如果有些事情不清楚请指出。
答案 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个字符
,则使用新字符串调用上述方法为每个可能的字母选择一个字母。