Metaprogramación con Babel
Índice
1 Cálculo del triángulo de Pascal
- Con el siguiente código Python se calculan las 5 primeras filas del
triángulo de Pascal. El resultado es la tabla
triangulo-de-Pascal
#+NAME: triangulo-de-Pascal
#+BEGIN_SRC python :var n=5 :exports both
def triangulo_Pascal(n):
if n == 0:
return [[1]]
triangulo_anterior = triangulo_Pascal(n-1)
fila_anterior = triangulo_anterior[n-1]
fila_actual = map(sum, zip([0] + fila_anterior, fila_anterior + [0]))
return triangulo_anterior + [fila_actual]
return triangulo_Pascal(n)
#+END_SRC
produce
| 1 | |||||
| 1 | 1 | ||||
| 1 | 2 | 1 | |||
| 1 | 3 | 3 | 1 | ||
| 1 | 4 | 6 | 4 | 1 | |
| 1 | 5 | 10 | 10 | 5 | 1 |
2 De la tabla al grafo de Pascal
- En el siguiente código Python, se pasa la tabla
triangulo-de-Pascal(a través de la variabletp) y genera un grafo (grafo-Pascal) en la sintaxis de Graphviz
#+NAME: grafo-Pascal
#+BEGIN_SRC python :var tp=triangulo-de-Pascal :results output :exports both
def node(i, j):
return '"%d_%d"' % (i+1, j+1)
def edge(i1, j1, i2, j2):
return '%s--%s;' % (node(i1, j1), node(i2,j2))
def node_with_edges(i, j):
line = '%s [label="%d"];' % (node(i, j), tp[i][j])
if j > 0:
line += edge(i-1, j-1, i, j)
if j < len(tp[i])-1:
line += edge(i-1, j, i, j)
return line
tp = [filter(None, row) for row in tp]
print '\n'.join([node_with_edges(i, j)
for i in range(len(tp))
for j in range(len(tp[i]))])
#+END_SRC
produce
"1_1" [label="1"]; "2_1" [label="1"];"1_1"--"2_1"; "2_2" [label="1"];"1_1"--"2_2"; "3_1" [label="1"];"2_1"--"3_1"; "3_2" [label="2"];"2_1"--"3_2";"2_2"--"3_2"; "3_3" [label="1"];"2_2"--"3_3"; "4_1" [label="1"];"3_1"--"4_1"; "4_2" [label="3"];"3_1"--"4_2";"3_2"--"4_2"; "4_3" [label="3"];"3_2"--"4_3";"3_3"--"4_3"; "4_4" [label="1"];"3_3"--"4_4"; "5_1" [label="1"];"4_1"--"5_1"; "5_2" [label="4"];"4_1"--"5_2";"4_2"--"5_2"; "5_3" [label="6"];"4_2"--"5_3";"4_3"--"5_3"; "5_4" [label="4"];"4_3"--"5_4";"4_4"--"5_4"; "5_5" [label="1"];"4_4"--"5_5"; "6_1" [label="1"];"5_1"--"6_1"; "6_2" [label="5"];"5_1"--"6_2";"5_2"--"6_2"; "6_3" [label="10"];"5_2"--"6_3";"5_3"--"6_3"; "6_4" [label="10"];"5_3"--"6_4";"5_4"--"6_4"; "6_5" [label="5"];"5_4"--"6_5";"5_5"--"6_5"; "6_6" [label="1"];"5_5"--"6_6";
3 Generación por Graphviz del grafo de Pascal
- Con el siguiente código, Graphviz genera el dibujo del grafo de Pascal
(a partir del
grafo-Pascalanterior)
#+HEADERS: :file imagenes/triangulo-de-Pascal.png :cmdline -Tpng
#+BEGIN_SRC dot :var grafo=grafo-Pascal :exports none
graph {
$grafo
}
#+END_SRC
El dibujo del grafo es