Tema

[Resuelto] Ej 1 P7

2 respuestas 4662 visitas

Bueno, aca va lo q escribi, si alguien tiene mejores ideas, comentenlas =)
(se q pude haber hecho todosDistintos de otra forma, pero el pertenece probablemente lo use en todos lados mas adelante)

ultimo::[Integer]->Integer
ultimo (x:xs)|not(xs == [])  = ultimo xs
	     |otherwise = x

principio::[Integer]->[Integer]
principio (x:xs)| xs == [] = []
		|otherwise = [x]++(principio xs)

todosIguales::[Integer]->Bool
todosIguales (x:xs)|xs == []     = True
		   |x == head xs = todosIguales xs	--vale head???
		   |otherwise    = False 

todosDistintos::[Integer]->Bool
todosDistintos [] = True
todosDistintos (x:xs)|pertenece x xs = False
		     |otherwise      = todosDistintos xs

pertenece::Integer->[Integer]->Bool                      --vale elem???
pertenece a []               = False
pertenece a (x:xs)|a==x      = True
		  |otherwise = pertenece a xs

mismosElems::[Integer]->[Integer]->Bool 
mismosElems [] y                           = True
mismosElems (x:xs) y |pertenece x y        = mismosElems xs y
	  	     |otherwise 	   = False

Tengo prácticamente lo mismo excepto por un detalle en el último...

La función que vos definiste no chequería sólo que la primer lista está contenida en la segunda? Yo definí de la misma forma una auxiliar ("contenida") y después en la función principal chequeé la contensión en ambos sentidos.

mismosElementos :: [Integer] -> [Integer] -> Bool
mismosElementos x y = (contenida x y) && (contenida y x)

contenida :: [Integer] -> [Integer] -> Bool
contenida [] ys = True
contenida (x:xs) ys
	| (existeIgual x ys) = ( contenida xs ys )
	| otherwise = False

Ahh, existeIgual vendría a ser lo mismo que tu pertenece

Saludos!

Si, hoy un amigo probo un par de listas y me rompio el ejercicio..
y en cuanto a las funcoines de pertenencia... podemos usar tranquilamente elem notElem etc....
(genial)