Академический Документы
Профессиональный Документы
Культура Документы
CURSO 2013-2014
GRADO INGENIERA INFORMTICA
Alumno: Vctor Colomo Gmez
DNI:
E-Mail: victor.colomo@gmail.com
Telfono:
Centro Asociado: Las Tablas (Madrid)
NDICE
FUNCIONES PROGRAMADAS
A continuacin se presentan las funciones empleadas en la prctica, se muestra el
cdigo de cada una de ellas y ejemplos de su correcto funcionamiento. En la carpeta
raz se ha incluido el archivo Sumas.hs.
Para poder utilizar varias funciones para el manejo de las lista se ha importado el
mdulo Data.List (import Data.List).
Se ha supesto que el nmero de sumandos puede ser mayor que el nmero de
resultados
FUNCIN dosQueSumen
A la hora de programar esta funcin me he encontrado con el siguiente problema
para aadir correctamente los sumandos: si un nmero es par y su mitad se
encuentra en la lista de sumandos. Inicialmente he desarrollado esta funcin:
dosQueSumen2 :: Int -> [Int] -> [Suma]
dosQueSumen2 n [] = []
dosQueSumen2 x xs = [(y,z) | y <-xs, z<-xs, x==y+z]
FUNCIN sinRepes
Se utiliza notElem para comprobar si el elemento (a,b) no se encuentra en la lista de
la forma (a,b) (b,a), si no est lo aadimos y vamos reduciendo el problema de
forma recursiva, si est no se aade (se aadir el ltimo que se encuentre).
FUNCIN eliminarSumandos
Funcin auxiliar utilizada en la funcin generarHijosNodo, se le pasan como
argumentos una pareja de sumandos y una lista. Devuelve la lista sin la pareja de
sumandos.
Su funcionamiento es el siguiente:
FUNCIN generarHijosNodo
Funcin auxiliar, a la que se le pasan como argumentos la lista de sumandos
disponibles y un nodo y devuelve todos los hijos posibles a partir de ese nodo.
Su funcionamiento es el siguiente:
FUNCIN hijosNodo
La funcin devuelve una lista con los nodos resultantes de elegir una pareja de
sumandos de la lista de sumandos que sumen un elemento de la lista de resultados.
Si no hay sumandos disponibles la funcin devuelve la cadena vaca, en caso
contrario llama a la funcin generarHijosNodo.
FUNCIN esSol
Devuelve true si un nodo es solucin (si la lista de resultados est vaca).
FUNCIN imprimeLista
Funcin auxiliar que transforma todos los nodos que son solucin en una sola lista
de soluciones
FUNCIN resuelveSuma
Funcin principal encargada de resolver el problema
(8,10). Para
)] ++ dosQueSumen3 n xs
En la versin funcional (Haskell) la estructura de datos utilizada son las listas. Las
listas son muy potentes y hay muchas funciones disponibles para poder operar con
ellas. Los lenguajes funcionales tiene la propiedad de la transparencia referencial,
con lo que se evitan los efectos colaterales (su valor slo depende de sus
argumentos). Tambin nos aprovechamos de la evaluacin perezosa que retrasa el
clculo de una expresin hasta que sea necesario, con lo que tambin se puede
mejorar la velocidad de computacin. Adems se pueden crear listas infinitas, cosa
que no podemos realizar en Java.
En Java utilizamos una clase para representar un nodo. En una clase se incluyen
los atributos y las funciones. Podramos utilizar un Array o ArrayList para representar
una lista de nodos. Como ocurre con Haskell, para el manejo de Arrays Java
dispone de multitud de funciones.
10
fun vuelta-atrs(ensayo)
si vlido(ensayo)
entonces dev ensayo
si no
lista-ensayo compleciones(ensayo)
mientras no vaca(lista-ensayo) ^ no resultado
hijo primero(lista-ensayo)
lista-ensayo resto(lista-ensayo)
si condiciones-de-poda(hijo)
entonces resultado vuelta-atrs(hijo)
fsi
fmientras
fsi
ffun
import java.util.*;
public class Algoritmo
{
// MTODO Principal que recorre las lista de compleciones
public static void VueltaAtras(TipoNodo candidato) {
int sum=candidato.devuelveSum(); // N de sumandos
boolean exito=false;
// Variable para marcas si hemos encontrado una solucin
// Pila para almacenar los hijos
Sack <TipoNodo> listaCompleciones=new Stack <TipoNodo> ();
TipoNodo hijo=new TipoNodo(n); // Objeto TipoNodo, temporal para los clculos
if(sum==0){
// Si la lista de sumas es cero --> Solucin encontrada
exito=true;
numero_soluciones++;
} else { // Si no hemos encontrado una solucin, seguimos explorando el candidato
listaCompleciones=compleciones(candidato); // Rellenamos la pila de candidatos en
// compleciones
// Mientras la pila no este vaca todava no se han explorado todas las posibilidades
while ( !(listaCompleciones.isEmpty) {
hijo=listaCompleciones.pop();
// Extraemos el ltimo elemento de la pila
VueltaAtras(hijo);
// Lo reenviamos para completarlo
}
}
}
13
14
15