[英]How do I write a recursive algorithm for permutations?
我的问题与给定整数输入的输出排列的递归方法有关。 每个整数代表一组字母,例如电话的键盘。
所以集合看起来像:
1: {}
2: {"A", "B", "C"}
3: {"D", "E", "F"}
4: {"G", "H", "I"}
etc...
我需要产生给定一系列数字的代码,以输出字母的所有排列。
因此,输入123将输出:AD,AE,AF,BD,BF,CD,CE,CF
伪代码将是首选,我只精通Java,但是欢迎任何帮助。
请随时就如何回答此问题提供反馈,但我仍不确定如何在此处正确发布。
您可能具有一个非递归函数,该函数需要两个Set
并返回一个Set
排列:
private Set<String> getPermutations(Set<String> a, Set<String> b){
...
}
然后你可以有一个递归函数
public Set<String> recursivePermutations(List<Set<String>> sets){
if(sets.size() ==2){
return getPermutations(sets.get(0), sets.get(1));
}else{
return getPermutations(sets.get(0),recursivePermutations(sets.sublist(1,sets.size()-1));
}
}
如果您的列表中只有1个元素,则可能需要添加一个安全保护措施;如果确实不需要列表,则还可以使用Collection
。
编辑
递归背后的主要思想是有两种情况:一种简单情况(当您只有两个集合时),您可以应用非递归方法;另一种情况是,您必须在减小大小的问题上再次应用该函数时。
在我的示例中,如果有两个以上的集合,则递归地重新应用相同的函数,但集合的数量较少(该函数应用于第一个元素和其余集合)。
假设您首先将函数应用于n
集合的列表。 第二次应用函数时,将具有n-1
的列表,依此类推,直到达到n=2
的情况为止。 在这种情况下,您不需要使用递归,因为这是一个微不足道的情况。
这是在F#
中执行此操作的一种方法:
open System
open System.Collections.Generic
let pad = new Dictionary<int, string>()
pad.Add(2, "A,B,C")
pad.Add(3, "D,E,F")
pad.Add(4, "G,H,I")
let permutations = new List<string>()
let rec permute(digits: int list, alphas: string list) =
if List.length digits > 0 && List.length alphas = 0 then
permute(digits, ["#"] |> List.append (pad.[digits.[0]].Split([|','|]) |> List.ofArray))
else
match alphas with
| [_] ->
match digits with
| h::t -> permute(t, [])
| _ -> ()
| h::t ->
for i = 0 to List.length alphas - 2 do
permutations.Add(h + alphas.[i])
for j = 1 to List.length digits - 1 do
let others = pad.[digits.[j]].Split([|','|])
for o in others do
permutations.Add(h + o)
permute(digits, t)
| _ -> ()
permute([2;3;4;], [])
seq {
for o in permutations do
yield o
yield o.[1].ToString() + o.[0].ToString()
}
|> Seq.distinct
|> Seq.sort
|> Seq.iter(fun s -> Console.WriteLine(s))
;;
输出量
[2; 3; 4]
[]
[2; 3; 4]
[A; B; C; ... ]
AA
AB
AC
AD
AE
AF
AG
AH
AI
[2; 3; 4]
[B; C; #]
BB
BC
BD
BE
BF
BG
BH
BI
[2; 3; 4]
[C; #]
CC
CD
CE
CF
CG
CH
CI
[2; 3; 4]
[#]
[3; 4]
[]
[3; 4]
[D; E; F; ... ]
DD
DE
DF
DG
DH
DI
[3; 4]
[E; F; #]
EE
EF
EG
EH
EI
[3; 4]
[F; #]
FF
FG
FH
FI
[3; 4]
[#]
[4]
[]
[4]
[G; H; I; ... ]
GG
GH
GI
[4]
[H; I; #]
HH
HI
[4]
[I; #]
II
[4]
[#]
[]
[]
AA
AB
AC
AD
AE
AF
AG
AH
AI
BA
BB
BC
BD
BE
BF
BG
BH
BI
CA
CB
CC
CD
CE
CF
CG
CH
CI
DA
DB
DC
DD
DE
DF
DG
DH
DI
EA
EB
EC
ED
EE
EF
EG
EH
EI
FA
FB
FC
FD
FE
FF
FG
FH
FI
GA
GB
GC
GD
GE
GF
GG
GH
GI
HA
HB
HC
HD
HE
HF
HG
HH
HI
IA
IB
IC
ID
IE
IF
IG
IH
II
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.