algoritmo recursivo mutuo para modificar lista anidada
Publicado por anttorval (1 intervención) el 19/06/2013 01:31:38
Hola a ver si alguien puede ayudarme a solucionar el siguiente problema:
Dado un termino f(x,g(h(x),y),z) , aplicar la siguiente sustitucion: sustituir la variable "x" por la constante "A". Con lo cual el resultado deberia ser : f(A,g(h(A),y),z).
Para ello, la forma en la que escribo un termino en python es mediante una lista, quedando expresado el termino anterior de la siguiente forma: termino=[["funtor1"],"x",[["funtor2"],[["funtor3"],"x"],"y"],"z"] y la sustitucion a aplicar así: o=[["x","A"]].
Mi algoritmo recursivo es el siguiente:
El problema es que al hacer la llamada print(aplicarSustitucionTermino(termino,o)) , creo que realiza la traza correctamente pero a la hora de modificar la lista anidada solo realiza las modificaciones correctamente si ésta se encuentra en el primer nivel de anidamiento, como es el caso de la primera "x", si se encuentra en un nivel de anidamiento mayor como es el caso de la segunda "x" no realiza la sustitucion.
Dado un termino f(x,g(h(x),y),z) , aplicar la siguiente sustitucion: sustituir la variable "x" por la constante "A". Con lo cual el resultado deberia ser : f(A,g(h(A),y),z).
Para ello, la forma en la que escribo un termino en python es mediante una lista, quedando expresado el termino anterior de la siguiente forma: termino=[["funtor1"],"x",[["funtor2"],[["funtor3"],"x"],"y"],"z"] y la sustitucion a aplicar así: o=[["x","A"]].
Mi algoritmo recursivo es el siguiente:
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
Variables=["a","b","c","d","e","f","g","h","i","j","k","l","m","o","p","q","r","s","t","u","v","w","x","y","z"]
Constantes=["A","B","C","D","E","F","G","H","I","J","K","L","M","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
def aplicarSustitucionTermino (Termino,o):
if Termino==o[0][0]:
Termino=o[0][1]
return Termino
if Termino in Constantes:
Termino=Termino
return Termino
if Termino in Variables and Termino!=o[0][0]:
Termino=Termino
return Termino
if isinstance(Termino, list):
for elemento in range(1,len(Termino)):
if len(Termino[elemento])>1:
aplicarSustitucionLista(Termino[elemento][1:],o)
if len(Termino[elemento])==1:
Termino[elemento]=aplicarSustitucionTermino(Termino[elemento],o)
return Termino
def aplicarSustitucionLista (Termino,o):
for elemento in range(len(Termino)):
if len(Termino[elemento])>1:
aplicarSustitucionLista(Termino[elemento][1:],o)
if len(Termino[elemento])==1:
Termino[elemento]=aplicarSustitucionTermino(Termino[elemento],o)
El problema es que al hacer la llamada print(aplicarSustitucionTermino(termino,o)) , creo que realiza la traza correctamente pero a la hora de modificar la lista anidada solo realiza las modificaciones correctamente si ésta se encuentra en el primer nivel de anidamiento, como es el caso de la primera "x", si se encuentra en un nivel de anidamiento mayor como es el caso de la segunda "x" no realiza la sustitucion.
Valora esta pregunta


0