0votos

Parentesis en Haskell

por josejuan hace 2 meses

no se que son las palabras de dynn

Generar conjuntos de parentesis validos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
-- Para poderse cerrar, debe haberse abierto antes, por lo que si 
-- llamamos `a` al número de aperturas pendientes y `c` al número 
-- de cierres pendientes, tenemos que abriremos o cerraremos 
-- decrementando `a` o `c` en cada caso siempre que luego sea c >= a. 
gen 0 0 = [[]] 
gen a c = r (a > 0) '(' 1 0 ++ r (c > a) ')' 0 1 
    where r p k u v = if p then (k:) <$> gen (a - u) (c - v) else [] 
 
 
 
 
 
 
 
{- 
 
> mapM_ print $ gen 3 3 
"((()))" 
"(()())" 
"(())()" 
"()(())" 
"()()()" 
> mapM_ print $ gen 4 4 
"(((())))" 
"((()()))" 
"((())())" 
"((()))()" 
"(()(()))" 
"(()()())" 
"(()())()" 
"(())(())" 
"(())()()" 
"()((()))" 
"()(()())" 
"()(())()" 
"()()(())" 
"()()()()" 
 
-} 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.