Está en la página 1de 109

Ejercicios de programacin funcional con Haskell

Jos A. Alonso Jimnez

Grupo de Lgica Computacional Dpto. de Ciencias de la Computacin e Inteligencia Articial Universidad de Sevilla Sevilla, 8 de Agosto de 2007 (Versin de 20 de septiembre de 2007)

2 Esta obra est bajo una licencia ReconocimientoNoComercialCompartirIgual 2.5 Spain de Creative Commons.

Se permite: copiar, distribuir y comunicar pblicamente la obra hacer obras derivadas Bajo las condiciones siguientes: Reconocimiento. Debe reconocer los crditos de la obra de la manera especicada por el autor. No comercial. No puede utilizar esta obra para nes comerciales. Compartir bajo la misma licencia. Si altera o transforma esta obra, o genera una obra derivada, slo puede distribuir la obra generada bajo una licencia idntica a sta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor.

Esto es un resumen del texto legal (la licencia completa). Para ver una copia de esta licencia, visite httpXGGretiveommonsForgGliensesGyEnEsGPFSGesG o envie una carta a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

ndice general
1. Introduccin a la programacin funcional 1.1. Factorial . . . . . . . . . . . . . . . . . . 1.2. Nmero de combinaciones . . . . . . . . 1.3. Comprobacin de nmero impar . . . . 1.4. Cuadrado . . . . . . . . . . . . . . . . . 1.5. Suma de cuadrados . . . . . . . . . . . . 1.6. Raices de ecuaciones de segundo grado 1.7. Valor absoluto . . . . . . . . . . . . . . . 1.8. Signo . . . . . . . . . . . . . . . . . . . . 1.9. Conjuncin . . . . . . . . . . . . . . . . . 1.10. Anterior de un nmero natural . . . . . 1.11. Potencia . . . . . . . . . . . . . . . . . . 1.12. Funcin identidad . . . . . . . . . . . . . 7 7 9 10 11 12 13 13 14 15 15 16 17 19 20 20 21 22 23 23 24 25 26 27 27 28 29 30 30 31

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

2. Nmeros y funciones 2.1. Casi igual . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Siguiente de un nmero . . . . . . . . . . . . . . . . . . 2.3. Doble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Mitad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5. Inverso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6. Potencia de dos . . . . . . . . . . . . . . . . . . . . . . . 2.7. Reconocimiento de nmeros positivos . . . . . . . . . . 2.8. Aplicacin de una funcin a los elementos de una lista 2.9. Filtrado mediante una propiedad . . . . . . . . . . . . . 2.10. Suma de los elementos de una lista . . . . . . . . . . . . 2.11. Producto de los elementos de una lista . . . . . . . . . . 2.12. Conjuncin sobre una lista . . . . . . . . . . . . . . . . . 2.13. Disyuncin sobre una lista . . . . . . . . . . . . . . . . . 2.14. Plegado por la derecha . . . . . . . . . . . . . . . . . . . 2.15. Plegado por la izquierda . . . . . . . . . . . . . . . . . . 2.16. Resultados acumulados . . . . . . . . . . . . . . . . . . 3

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

4 2.17. 2.18. 2.19. 2.20. 2.21. 2.22. 2.23. 2.24. 2.25. 2.26. 2.27. 2.28. Lista de factoriales . . . . . . . . . . Iteracin hastaque . . . . . . . . . . Composicin de funciones . . . . . . Intercambio de orden de argumentos Relacin de divisibilidad . . . . . . . Lista de divisores de un nmero . . Comprobacin de nmero primo . . Lista de primos . . . . . . . . . . . . Clculo del da de la semana . . . . . Diferenciacin numrica . . . . . . . Clculo de la raz cuadrada . . . . . Clculo de ceros de una funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

ndice general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 33 33 34 34 35 35 36 36 37 38 39 41 43 43 44 45 45 45 47 48 48 49 50 50 51 52 53 54 56 57 58 59 61 62 64 64 65 65 66

3. Estructuras de datos 3.1. Relacin de igualdad entre listas . . . . . . . . . . . . . . . . 3.2. Concatenacin de listas . . . . . . . . . . . . . . . . . . . . . . 3.3. Concatenacin de una lista de listas . . . . . . . . . . . . . . 3.4. Cabeza de una lista . . . . . . . . . . . . . . . . . . . . . . . . 3.5. Resto de una lista . . . . . . . . . . . . . . . . . . . . . . . . . 3.6. ltimo elemento . . . . . . . . . . . . . . . . . . . . . . . . . . 3.7. Lista sin el ltimo elemento . . . . . . . . . . . . . . . . . . . 3.8. Segmento inicial . . . . . . . . . . . . . . . . . . . . . . . . . . 3.9. Segmento inicial ltrado . . . . . . . . . . . . . . . . . . . . . 3.10. Segmento nal . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.11. Segmento nal ltrado . . . . . . . . . . . . . . . . . . . . . . 3.12. Nsimo elemento de una lista . . . . . . . . . . . . . . . . . 3.13. Inversa de una lista . . . . . . . . . . . . . . . . . . . . . . . . 3.14. Longitud de una lista . . . . . . . . . . . . . . . . . . . . . . . 3.15. Comprobacin de pertenencia de un elemento a una lista . . 3.16. Comprobacin de no pertenencia de un elemento a una lista 3.17. Comprobacin de que una lista est ordenada . . . . . . . . 3.18. Comprobacin de la igualdad de conjuntos . . . . . . . . . . 3.19. Insercin ordenada de un elemento en una lista . . . . . . . . 3.20. Ordenacin por insercin . . . . . . . . . . . . . . . . . . . . 3.21. Mnimo elemento de una lista . . . . . . . . . . . . . . . . . . 3.22. Mezcla de dos listas ordenadas . . . . . . . . . . . . . . . . . 3.23. Ordenacin por mezcla . . . . . . . . . . . . . . . . . . . . . . 3.24. Dgito correspondiente a un carcter numrico . . . . . . . . 3.25. Carcter correspondiente a un dgito . . . . . . . . . . . . . . 3.26. Lista innita de nmeros . . . . . . . . . . . . . . . . . . . . . 3.27. Lista con un elemento repetido . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . .

ndice general 3.28. 3.29. 3.30. 3.31. 3.32. 3.33. 3.34. 3.35. 3.36. 3.37. 3.38. 3.39. 3.40. 3.41. 3.42. 3.43. 3.44. 3.45. 3.46. 3.47. 3.48. 3.49. 3.50. 3.51. 3.52. 3.53. 3.54. Lista con un elemento repetido un nmero dado de veces Iteracin de una funcin . . . . . . . . . . . . . . . . . . . Conversin de nmero entero a cadena . . . . . . . . . . Clculo de primos mediante la criba de Erasttenes . . . Comprobacin de que todos los elementos son pares . . . Comprobacin de que todos los elementos son impares . Tringulos numricos . . . . . . . . . . . . . . . . . . . . . Posicin de un elemento en una lista . . . . . . . . . . . . Ordenacin rpida . . . . . . . . . . . . . . . . . . . . . . Primera componente de un par . . . . . . . . . . . . . . . Segunda componente de un par . . . . . . . . . . . . . . . Componentes de una terna . . . . . . . . . . . . . . . . . Creacin de variables a partir de pares . . . . . . . . . . . Divisin de una lista . . . . . . . . . . . . . . . . . . . . . Sucesin de Fibonacci . . . . . . . . . . . . . . . . . . . . . Incremento con el mnimo . . . . . . . . . . . . . . . . . . Longitud de camino entre puntos bidimensionales . . . . Nmeros racionales . . . . . . . . . . . . . . . . . . . . . . Mximo comn divisor . . . . . . . . . . . . . . . . . . . . Bsqueda en una lista de asociacin . . . . . . . . . . . . Emparejamiento de dos listas . . . . . . . . . . . . . . . . Emparejamiento funcional de dos listas . . . . . . . . . . Curricacin . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones sobre rboles . . . . . . . . . . . . . . . . . . . Bsqueda en lista ordenada . . . . . . . . . . . . . . . . . Movimiento segn las direcciones . . . . . . . . . . . . . Los racionales como tipo abstracto de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 67 68 68 69 70 71 72 73 74 74 75 76 76 77 77 79 80 81 83 84 85 86 86 87 90 91 91 95 95 96 97 97 97 98 99 101 102 103 104

4. Aplicaciones de programacin funcional 4.1. Segmentos iniciales . . . . . . . . . . . . . . 4.2. Segmentos nales . . . . . . . . . . . . . . . 4.3. Segmentos . . . . . . . . . . . . . . . . . . . 4.4. Sublistas . . . . . . . . . . . . . . . . . . . . 4.5. Comprobacin de subconjunto . . . . . . . 4.6. Comprobacin de la igualdad de conjuntos 4.7. Permutaciones . . . . . . . . . . . . . . . . . 4.8. Combinaciones . . . . . . . . . . . . . . . . 4.9. El problema de las reinas . . . . . . . . . . . 4.10. Nmeros de Hamming . . . . . . . . . . . . Bibliografa

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

6 Indice de deniciones

ndice general 105

Captulo 1 Introduccin a la programacin funcional


Contenido
1.1. Factorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Nmero de combinaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 7 9

1.3. Comprobacin de nmero impar . . . . . . . . . . . . . . . . . . . . . . . 10 1.4. Cuadrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5. Suma de cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.6. Raices de ecuaciones de segundo grado . . . . . . . . . . . . . . . . . . . 13 1.7. Valor absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.8. Signo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.9. Conjuncin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.10. Anterior de un nmero natural . . . . . . . . . . . . . . . . . . . . . . . . 15 1.11. Potencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.12. Funcin identidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

1.1.

Factorial

Ejercicio 1.1. Denir la funcin ftoril tal que ftoril n es el factorial de n. Por ejemplo,

ftoril R ;PR
Solucin: Vamos a presentar distintas deniciones. 7

Captulo 1. Introduccin a la programacin funcional 1. Primera denicin: Con condicionales:

ftI XX snteger Eb snteger ftI n a if n aa H then I else n B ftI @nEIA


2. Segunda denicin: Mediante guardas:

ftP ftP | |

XX snteger Eb snteger n n aa H a I otherwise a n B ftP @nEIA

3. Tercera denicin: Mediante patrones:

ftQ XX snteger Eb snteger ftQ H a I ftQ n a n B ftQ @nEIA


4. Cuarta denicin: Restriccin del dominio mediante guardas

ftR ftR | |

XX snteger Eb snteger n n aa H a I n ba I a n B ftR @nEIA

5. Quinta denicin: Restriccin del dominio mediante patrones:

ftS XX snteger Eb snteger ftS H a I ftS @nCIA a @nCIA B ftS n


6. Sexta denicin: Mediante predenidas

ftT XX snteger Eb snteger ftT n a produt IFFn


7. Sptima denicin: Mediante plegado:

ftU XX snteger Eb snteger ftU n a foldr @BA I IFFn

1.2. Nmero de combinaciones Se pueden comprobar todas las deniciones con

ptorilb f R | f `E ftIDftPDftQDftRDftSDftTDftU PRDPRDPRDPRDPRDPRDPR


Las deniciones son equivalentes sobre los nmeros naturales:

propequivleni XX snteger Eb roperty propequivleni x a x ba H aab @ftP x aa ftI x 88 ftQ x aa ftI x 88 ftR x aa ftI x 88 ftS x aa ftI x 88 ftT x aa ftI x 88 ftU x aa ftI xA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


La denicin ms elegante es la quinta y es a la que nos referimos como ftoril

ftoril a ftS

1.2.

Nmero de combinaciones

Ejercicio 1.2. Denir la funcin om tal que om n k es el nmero de combinaciones de n elementos tomados de k en k; es decir, n m Por ejemplo.

n! k! (n k)!

om T P ; IS
Solucin:

om n k a @ftoril nA div @@ftoril kA B @ftoril @nEkAAA

10

Captulo 1. Introduccin a la programacin funcional

1.3.

Comprobacin de nmero impar

Ejercicio 1.3. Denir la funcin impr tal que impr x se verica si el nmero x es impar. Por ejemplo,

impr U impr T

; ;

rue plse

Solucin: Presentamos distintas deniciones: 1. Usando la predenida odd

imprI XX snteger Eb fool imprI a odd


2. Usando las predenidas not y even:

imprP XX snteger Eb fool imprP x a not @even xA


3. Usando las predenidas not, even y @FA:

imprQ XX snteger Eb fool imprQ a not F even


4. Por recursin:

imprR XX snteger Eb fool imprR x | x b H a imprRux | otherwise a imprRux where imprRux H a imprRux I a imprRux @nCPA a
Las deniciones son equivalentes:

x @ExA plse rue imprRux n

propequivleni XX snteger Eb fool propequivleni x a imprP x aa imprI x 88 imprQ x aa imprI x 88 imprR x aa imprI x
Comprobacin

1.4. Cuadrado

11

winb quikghek propequivleni yuD pssed IHH testsF

1.4.

Cuadrado

Ejercicio 1.4. Denir la funcin udrdo tal que udrdo x es el cuadrado del nmero x. Por ejemplo,

udrdo Q ;

Solucin: Presentamos distintas deniciones: 1. Mediante @BA

udrdoI XX xum ab Eb udrdoI x a xBx


2. Mediante @A

udrdoP XX xum ab Eb udrdoP x a xP


3. Mediante secciones:

udrdoQ XX xum ab Eb udrdoQ a @PA


4. Usaremos como udrdo la primera

udrdo a udrdoI
Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni x a udrdoP x aa udrdoI x 88 udrdoQ x aa udrdoI x


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

12

Captulo 1. Introduccin a la programacin funcional

1.5.

Suma de cuadrados

Ejercicio 1.5. Denir la funcin sumdeudrdos tal que sumdeudrdos l es la suma de los cuadrados de los elementos de la lista l. Por ejemplo,

sumdeudrdos IDPDQ ;

IR

Solucin: Presentamos distintas deniciones: 1. Con sum, mp y udrdo:

sumdeudrdosI XX snteger Eb snteger sumdeudrdosI l a sum @mp udrdo lA


2. Con sum y listas intnsionales:

sumdeudrdosP XX snteger Eb snteger sumdeudrdosP l a sum xBx | x `E l


3. Con sum, mp y lmd:

sumdeudrdosQ XX snteger Eb snteger sumdeudrdosQ l a sum @mp @x Eb xBxA lA


4. Por recursin:

sumdeudrdosR XX snteger Eb snteger sumdeudrdosR a H sumdeudrdosR @xXxsA a xBx C sumdeudrdosR xs


Las deniciones son equivalentes:

propequivleni XX snteger Eb fool propequivleni xs a sumdeudrdosP xs aa sumdeudrdosI xs 88 sumdeudrdosQ xs aa sumdeudrdosI xs 88 sumdeudrdosR xs aa sumdeudrdosI xs
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

1.6. Raices de ecuaciones de segundo grado

13

1.6.

Raices de ecuaciones de segundo grado

Ejercicio 1.6. Denir la funcin ries tal que ries es la lista de las raices de la ecuacin ax2 + bc + c = 0. Por ejemplo,

ries I Q P

EIFHDEPFH

Solucin: Presentamos distintas deniciones: 1. Denicin directa:

riesI XX houle Eb houle Eb houle Eb houle riesI a @ECsqrt@BERBBAAG@PBAD @EEsqrt@BERBBAAG@PBA


2. Con entornos locales

riesP XX houle Eb houle Eb houle Eb houle riesP a @ECdAGnD @EEdAGn where d a sqrt@BERBBA n a PB
La segunda es mejor en legibilidad y en eciencia:

winb Xset Cs winb riesI I EIFHDEPFH @IQR redutionsD winb riesP I EIFHDEPFH @IHR redutionsD

Q P PRP ellsA Q P IVQ ellsA

1.7.

Valor absoluto

Ejercicio 1.7. Redenir la funcin s tal que s x es el valor absoluto de x. Por ejemplo,

s @EQA ; Q s Q ; Q
Solucin: Presentamos distintas deniciones: 1. Con condicionales:

14

Captulo 1. Introduccin a la programacin funcional

nsI XX @xum D yrd A ab Eb nsI x a if xbH then x else @ExA


2. Con guardas:

nsP XX @xum D yrd A ab Eb nsP x | xbH a x | otherwise a Ex


Las deniciones son equivalentes

propequivleni XX snt Eb fool propequivleni x a nsI x aa s x 88 nsP x aa s x

1.8.

Signo

Ejercicio 1.8. Redenir la funcin signum tal que signum x es -1 si x es negativo, 0 si x es cero y 1 si x es positivo. Por ejemplo,

signum U ; I signum H ; H signum @ERA ; EI


Solucin:

nsignum x | x b H a I | x aa H a H | otherwise a EI
Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni x a nsignum x aa signum x


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

1.9. Conjuncin

15

1.9.

Conjuncin

Ejercicio 1.9. Redenir la funcin 88 tal que x 88 y es la conjuncin de x e y Por ejemplo,

rue 88 plse ; plse


Solucin:

@888A XX fool Eb fool Eb fool plse 888 x a plse rue 888 x a x


Las deniciones son equivalentes:

propequivleni x y a @x 888 yA aa @x 88 yA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

1.10.

Anterior de un nmero natural

Ejercicio 1.10. Denir la funcin nterior tal que nterior x es el anterior del nmero natural x. Por ejemplo,

nterior Q ; P nterior H ; rogrm errorX pttern mth filureX nterior H


Solucin: Presentamos distintas deniciones: 1. Con patrones:

nteriorI XX snt Eb snt nteriorI @nCIA a n


2. Con guardas:

nteriorP XX snt Eb snt nteriorP n | nbH a nEI


Las deniciones son equivalentes sobre los nmeros naturales:

16

Captulo 1. Introduccin a la programacin funcional

propequivleni XX snt Eb roperty propequivleni n a nbH aab nteriorI n aa nteriorP n


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

1.11.

Potencia

Ejercicio 1.11. Redenir la funcin poteni tal que poteni x y es x y . Por ejemplo,

poteni P R ; IT poteni QFI P ; WFTI


Solucin: Presentamos distintas deniciones: 1. Por patrones:

poteniI XX xum ab Eb snt Eb poteniI x H a I poteniI x @nCIA a x B @poteniI x nA


2. Por condicionales:

poteniP XX xum ab Eb snt Eb poteniP x n a if naaH then I else x B poteniP x @nEIA


3. Denicin eciente:

poteniQ XX xum ab Eb snt Eb poteniQ x H a I poteniQ x n | n b H a f x @nEIA x where f H y a y f x n y a g x n where g x n | even n a g @xBxA @nquotPA | otherwise a f x @nEIA @xByA
Las deniciones son equivalentes:

1.12. Funcin identidad

17

propequivleni propequivleni n ba H aab @poteniI x poteniP x poteniQ x


Comprobacin

XX snt Eb snt Eb roperty x n a n aa xn 88 n aa xn 88 n aa xnA

winb quikghek propequivleni yuD pssed IHH testsF

1.12.

Funcin identidad

Ejercicio 1.12. Redenir la funcin id tal que id x es x. Por ejemplo,

id Q ; Q
Solucin: La denicin es

nid XX Eb nid x a x

18

Captulo 1. Introduccin a la programacin funcional

Captulo 2 Nmeros y funciones


Contenido
2.1. Casi igual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2. Siguiente de un nmero . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3. Doble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.4. Mitad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5. Inverso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.6. Potencia de dos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.7. Reconocimiento de nmeros positivos . . . . . . . . . . . . . . . . . . . 24 2.8. Aplicacin de una funcin a los elementos de una lista . . . . . . . . . 25 2.9. Filtrado mediante una propiedad . . . . . . . . . . . . . . . . . . . . . . 26 2.10. Suma de los elementos de una lista . . . . . . . . . . . . . . . . . . . . . 27 2.11. Producto de los elementos de una lista . . . . . . . . . . . . . . . . . . . 27 2.12. Conjuncin sobre una lista . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.13. Disyuncin sobre una lista . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2.14. Plegado por la derecha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.15. Plegado por la izquierda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.16. Resultados acumulados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.17. Lista de factoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.18. Iteracin hastaque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.19. Composicin de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.20. Intercambio de orden de argumentos . . . . . . . . . . . . . . . . . . . . 34 2.21. Relacin de divisibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.22. Lista de divisores de un nmero . . . . . . . . . . . . . . . . . . . . . . . 35

19

20

Captulo 2. Nmeros y funciones


2.23. Comprobacin de nmero primo . . . . . . . . . . . . . . . . . . . . . . 35 2.24. Lista de primos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.25. Clculo del da de la semana . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.26. Diferenciacin numrica . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.27. Clculo de la raz cuadrada . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.28. Clculo de ceros de una funcin . . . . . . . . . . . . . . . . . . . . . . . 39

2.1.

Casi igual

Ejercicio 2.1. Denir el operador ~a tal que x ~a y se verica si | x y| < 0,0001. Por ejemplo,

QFHHHHI ~a QFHHHHP ; rue QFI ~a QFP ; plse


Solucin:

infix R ~a @~aA XX plot Eb plot Eb fool x ~a y a s@xEyA ` HFHHHI

2.2.

Siguiente de un nmero

Ejercicio 2.2. Denir la funcin siguiente tal que siguiente x sea el siguiente del nmero entero x. Por ejemplo,

siguiente Q ; R
Solucin: Presentamos distintas deniciones: 1. Mediante seccin:

siguienteI XX snteger Eb snteger siguienteI a @CIA


2. Mediante instanciacin parcial:

siguienteP XX snteger Eb snteger siguienteP a @CA I


3. Usaremos como siguiente la primera

2.3. Doble

21

siguiente a siguienteI
Las deniciones son equivalentes:

propequivleni XX snteger Eb fool propequivleni x a siguienteI x aa siguienteP x


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.3.

Doble

Ejercicio 2.3. Denir la funcin dole tal que dole x es el doble de x. Por ejemplo,

dole Q ; T
Solucin: Se presentan distintas deniciones: 1. Denicin ecuacional:

doleI XX xum ab Eb doleI x a PBx


2. Denicin con instanciacin parcial:

doleP XX xum ab Eb doleP a @@BA PA


3. Denicin con secciones:

doleQ XX xum ab Eb doleQ a @PBA


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni x a doleP x aa doleI x 88 doleQ x aa doleI x

22 Comprobacin

Captulo 2. Nmeros y funciones

winb quikghek propequivleni yuD pssed IHH testsF

2.4.

Mitad

Ejercicio 2.4. Denir la funcin mitd tal que mitd x es la mitad de x. Por ejemplo,

mitd T ; QFH mitd S ; PFS


Solucin: Se presentan distintas deniciones: 1. Denicin ecuacional:

mitdI XX houle Eb houle mitdI x a xGP


2. Denicin con instanciacin parcial:

mitdP XX houle Eb houle mitdP a @flip @GA PA


3. Denicin con secciones:

mitdQ XX houle Eb houle mitdQ a @GPA


Las deniciones son equivalentes para lon nmeros no nulos:

propequivleni XX houle Eb fool propequivleni x a mitdP x aa mitdI x 88 mitdQ x aa mitdI x


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.5. Inverso

23

2.5.

Inverso

Ejercicio 2.5. Denir la funcin inverso tal que inverso x es el inverso de x. Por ejemplo,

inverso P ; HFS
Solucin: Se presentan distintas deniciones: 1. Denicin ecuacional:

inversoI XX houle Eb houle inversoI x a IGx


2. Denicin con instanciacin parcial:

inversoP XX houle Eb houle inversoP a @@GA IA


3. Denicin con secciones:

inversoQ XX houle Eb houle inversoQ a @IGA


Las deniciones son equivalentes para lon nmeros no nulos:

propequivleni XX houle Eb roperty propequivleni x a x Ga H aab @inversoP x aa inversoI x 88 inversoQ x aa inversoI xA


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.6.

Potencia de dos

Ejercicio 2.6. Denir la funcin dosilevdoe tal que dosilevdoe x es 2x . Por ejemplo,

dosilevdoe Q ; V
Solucin: Se presentan distintas deniciones:

24 1. Denicin ecuacional:

Captulo 2. Nmeros y funciones

dosilevdoeI XX snt Eb snt dosilevdoeI x a Px


2. Denicin con instanciacin parcial:

dosilevdoeP XX snt Eb snt dosilevdoeP a @@A PA


3. Denicin con secciones:

dosilevdoeQ XX snt Eb snt dosilevdoeQ a @PA


Las deniciones son equivalentes:

propequivleni XX snt Eb roperty propequivleni x a x ba H aab @dosilevdoeP x aa dosilevdoeI x 88 dosilevdoeQ x aa dosilevdoeI xA


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.7.

Reconocimiento de nmeros positivos

Ejercicio 2.7. Denir la funcin esositivo tal que esositivo se verica si x es positivo. Por ejemplo,

esositivo Q ; rue esositivo @EQA ; plse


Solucin: Se presentan distintas deniciones: 1. Denicin ecuacional:

esositivoI XX snt Eb fool esositivoI x a xbH

2.8. Aplicacin de una funcin a los elementos de una lista 2. Denicin con instanciacin parcial:

25

esositivoP XX snt Eb fool esositivoP a @flip @bA HA


3. Denicin con secciones:

esositivoQ XX snt Eb fool esositivoQ a @bHA


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni x a esositivoP x aa esositivoI x 88 esositivoQ x aa esositivoI x


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.8.

Aplicacin de una funcin a los elementos de una lista

Ejercicio 2.8. Redenir la funcin mp tal que mp f l es la lista obtenida aplicando f a cada elemento de l. Por ejemplo,

mp @PBA IDPDQ ; PDRDT


Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

nmpI XX @ Eb A Eb Eb nmpI f a nmpI f @xXxsA a f x X nmpI f xs


2. Con listas intensionales:

nmpP XX @ Eb A Eb Eb nmpP f xs a f x | x `E xs

26 Las deniciones son equivalentes:

Captulo 2. Nmeros y funciones

propequivleni XX snt Eb fool propequivleni xs a nmpI @BPA xs aa mp @BPA xs 88 nmpP @BPA xs aa mp @BPA xs
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.9.

Filtrado mediante una propiedad

Ejercicio 2.9. Redenir la funcin filter tal que filter p l es la lista de los elementos de l que cumplen la propiedad p. Por ejemplo,

filter even IDQDSDRDPDTDI ; RDPDT filter @bQA IDQDSDRDPDTDI ; SDRDT


Solucin: Presentamos distintas deniciones: 1. Denicin por recursin:

nfilterI XX @ Eb foolA Eb Eb nfilterI p a nfilterI p @xXxsA | p x a x X nfilterI p xs | otherwise a nfilterI p xs


2. Denicin con listas intensionales:

nfilterP XX @ Eb foolA Eb Eb nfilterP p xs a x | x `E xsD p x


Las deniciones son equivalentes cuando la propiedad es even:

propequivleni XX snt Eb fool propequivleni xs a nfilterI even xs aa filter even xs 88 nfilterP even xs aa filter even xs
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.10. Suma de los elementos de una lista

27

2.10.

Suma de los elementos de una lista

Ejercicio 2.10. Redenir la funcin sum tal que sum l es la suma de los elementos de l. Por ejemplo,

nsum IDQDT ; IH
Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

nsumI XX xum ab Eb nsumI a H nsumI @xXxsA a x C nsumI xs


2. Denicin con plegado:

nsumP XX xum ab Eb nsumP a foldr @CA H


Las deniciones son equivalentes:

propequivleni propequivleni nsumI xs aa nsumP xs aa


Comprobacin

XX snt Eb fool xs a sum xs 88 sum xs

winb quikghek propequivleni yuD pssed IHH testsF

2.11.

Producto de los elementos de una lista

Ejercicio 2.11. Redenir la funcin produt tal que produt l es el producto de los elementos de l. Por ejemplo,

produt PDQDS ; QH
Solucin: Presentamos distintas deniciones: 1. Denicin recursiva

28

Captulo 2. Nmeros y funciones

nprodutI XX xum ab Eb nprodutI a I nprodutI @xXxsA a x B nprodutI xs


2. Denicin con plegado:

nprodutP XX xum ab Eb nprodutP a foldr @BA I


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a nprodutI xs aa produt xs 88 nprodutP xs aa produt xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.12.

Conjuncin sobre una lista

Ejercicio 2.12. Redenir la funcin nd tal que nd l se verica si todos los elementos de l son verdaderos. Por ejemplo,

nd I`PD P`QD I Ga H ; rue nd I`PD P`QD I aa H ; plse


Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

nndI XX fool Eb fool nndI a rue nndI @xXxsA a x 88 nndI xs


2. Denicin con plegado:

nndP XX fool Eb fool nndP a foldr @88A rue

2.13. Disyuncin sobre una lista 3. Las deniciones son equivalentes:

29

propequivleni propequivleni nndI xs aa nndP xs aa

XX fool Eb fool xs a nd xs 88 nd xs

winb quikghek propequivleni yuD pssed IHH testsF

2.13.

Disyuncin sobre una lista

Ejercicio 2.13. Redenir la funcin or tal que or l se verica si algn elemento de l es verdadero. Por ejemplo,

or I`PD P`QD I Ga H ; rue or Q`PD R`QD I aa H ; plse


Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

norI XX fool Eb fool norI a plse norI @xXxsA a x || norI xs


2. Denicin con plegado:

norP XX fool Eb fool norP a foldr @||A plse


3. Las deniciones son equivalentes:

propequivleni XX fool Eb fool propequivleni xs a norI xs aa or xs 88 norP xs aa or xs winb quikghek propequivleni yuD pssed IHH testsF

30

Captulo 2. Nmeros y funciones

2.14.

Plegado por la derecha

Ejercicio 2.14. Redenir la funcin foldr tal que foldr op e l pliega por la derecha la lista l colocando el operador op entre sus elementos y el elemento e al nal. Es decir,

foldr op e [x1,x2,x3] ; x1 op (x2 op (x3 op e)) foldr op e [x1,x2,...,xn] ; x1 op (x2 op (... op (xn op e)))
Por ejemplo,

foldr @CA Q PDQDS ; IQ foldr @EA Q PDQDS ; I


Solucin:

nfoldr XX @ Eb Eb A Eb Eb Eb nfoldr f e a e nfoldr f e @xXxsA a f x @nfoldr f e xsA

2.15.

Plegado por la izquierda

Ejercicio 2.15. Redenir la funcin foldl tal que foldl op e l pliega por la izquierda la lista l colocando el operador op entre sus elementos y el elemento e al principio. Es decir,

foldl op e [x1,x2,x3] ; (((e op x1) op x2) op x3 foldl op e [x1,x2,...,xn] ; (...((e op x1) op x2) ... op xn
Por ejemplo,

foldl @CA Q PDQDS ; IQ foldl @EA Q PDQDS ; EU


Solucin: Denicin recursiva

nfoldl XX @ Eb Eb A Eb Eb Eb nfoldl f z a z nfoldl f z @xXxsA a nfoldl f @f z xA xs


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni n xs a nfoldl @CA n xs aa foldl @CA n xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.16. Resultados acumulados

31

2.16.

Resultados acumulados

Ejercicio 2.16. Redenir la funcin snr tal que snr op e l pliega por la derecha la lista l colocando el operador op entre sus elementos y el elemento e al nal y escribe los resultados acumulados. Es decir,

scanr op e [x1,x2,x3] ; [x1 op (x2 op (x3 op e)), x2 op (x3 op e), x3 op e, e]


Por ejemplo,

snr @CA Q PDQDS ;IQDIIDVDQ


Solucin:

nsnr XX @ Eb Eb A Eb Eb Eb nsnr f qH a qH nsnr f qH @xXxsA a f x q X qs where qsd@qXA a nsnr f qH xs


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni n xs a nsnr @CA n xs aa snr @CA n xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

2.17.

Lista de factoriales

Ejercicio 2.17. Denir la funcin ftoriles tal que ftoriles n es la lista de los factoriales desde el factorial de H hasta el factorial de n. Por ejemplo,

ftoriles S ; IDIDPDTDPRDIPH
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva

32

Captulo 2. Nmeros y funciones

ftorilesI XX snteger Eb snteger ftorilesI n a reverse @ux nA where ux H a I ux @nCIA a @ftoril @nCIAA X ux n
2. Denicin recursiva con acumuladores:

ftorilesP XX snteger Eb snteger ftorilesP n a reverse @ux @nCIA H IA where ux n m @xXxsA a if naam then xs else ux n @mCIA @@@mCIABxAXxXxsA
3. Denicin con listas intensionales:

ftorilesQ XX snteger Eb snteger ftorilesQ n a ftoril x | x `E HFFn


4. Denicin con mp:

ftorilesR XX snteger Eb snteger ftorilesR n a mp ftoril HFFn


5. Denicin con snl:

ftorilesS XX snteger Eb snteger ftorilesS n a snl @BA I IFFn


Las deniciones son equivalentes:

propequivleni XX snteger Eb roperty propequivleni n a n ba H aab @ftorilesS n aa ftorilesI n 88 ftorilesP n aa ftorilesI n 88 ftorilesQ n aa ftorilesI n 88 ftorilesR n aa ftorilesI n 88 ftorilesS n aa ftorilesI nA
Comprobacin

2.18. Iteracin hastaque

33

winb quikghek propequivleni yuD pssed IHH testsF


Se puede observar la eciencia relativa en la siguiente sesin

winb Xset Cs winb ftorilesI IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @IUITWT redutionsD QPPTSW ellsA winb ftorilesP IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @PRSU redutionsD IQSVI ellsA winb ftorilesQ IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @ITWWPW redutionsD QIWTHW ellsA winb ftorilesR IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @ITWWQH redutionsD QIWTII ellsA winb ftorilesS IHH IDIDPDTDPRDIPHDUPHDSHRHDRHQPHDQTPVVHDQTPVVHHDQWWITVHHDFFF @PSSW redutionsD IPVUT ellsA winb
Se observa que las ms ecientes son la 2 y la 5.

2.18.

Iteracin hastaque

Ejercicio 2.18. Redenir la funcin until tal que until p f x aplica la f a x el menor nmero posible de veces, hasta alcanzar un valor que satisface el predicado p. Por ejemplo,

until @bIHHHA @PBA I ; IHPR


Solucin:

nuntil XX @ Eb foolA Eb @ Eb A Eb Eb nuntil p f x a if p x then x else nuntil p f @f xA

2.19.

Composicin de funciones

Ejercicio 2.19. Redenir la funcin @FA tal que f F g es la composicin de las funciones f y g; es decir, la funcin que aplica x en f@g@xAA. Por ejemplo,

34

Captulo 2. Nmeros y funciones

@udrdo F siguienteA P ; W @siguiente F udrdoA P ; S


Solucin:

ompuest XX @ Eb A Eb @ Eb A Eb @ Eb A @f ompuest gA x a f @g xA
Por ejemplo,

@udrdo ompuest siguienteA P ; W @siguiente ompuest udrdoA P ; S

2.20.

Intercambio de orden de argumentos

Ejercicio 2.20. Redenir la funcin flip que intercambia el orden de sus argumentos. Por ejemplo,

flip @EA S P ; EQ flip @GA S P ; HFR


Solucin:

flip XX @ Eb Eb A Eb Eb Eb flip f x y a f y x

2.21.

Relacin de divisibilidad

Ejercicio 2.21. Denir la funcin divisile tal que divisile x y se verica si x es divisible por y. Por ejemplo,

divisile W Q ; rue divisile W P ; plse


Solucin:

divisile XX snt Eb snt Eb fool divisile x y a x rem y aa H

2.22. Lista de divisores de un nmero

35

2.22.

Lista de divisores de un nmero

Ejercicio 2.22. Denir la funcin divisores tal que divisores x es la lista de los divisores de x. Por ejemplo,

divisores IP ; IDPDQDRDTDIP
Solucin: Se presentan distintas deniciones: 1. Mediante ltro:

divisoresI XX snt Eb snt divisoresI x a filter @divisile xA IFFx


2. Mediante comprensin:

divisoresP XX snt Eb snt divisoresP x a y | y `E IFFxD divisile x y


3. Equivalencia de las deniciones:

propequivleniIP x a divisoresI x aa divisoresP x


Compobacin:

hivisoresb quikghek propequivleniIP yuD pssed IHH testsF


4. Usaremos como divisores la segunda

divisores a divisoresP

2.23.

Comprobacin de nmero primo

Ejercicio 2.23. Denir la funcin primo tal que primo x se verica si x es primo. Por ejemplo,

primo S ; rue primo T ; plse


Solucin:

primo XX snt Eb fool primo x a divisores x aa IDx

36

Captulo 2. Nmeros y funciones

2.24.

Lista de primos

Ejercicio 2.24. Denir la funcin primos tal que primos x es la lista de los nmeros primos menores o iguales que x. Por ejemplo,

primos RH ; PDQDSDUDIIDIQDIUDIWDPQDPWDQIDQU
Solucin: Se presentan distintas deniciones: 1. Mediante ltrado:

primosI XX snt Eb snt primosI x a filter primo IFFx


2. Mediante comprensin:

primosP XX snt Eb snt primosP x a y | y `E IFFxD primo y

2.25.

Clculo del da de la semana

Ejercicio 2.25. Denir la funcin d tal que di d m es el da de la semana correspondiente al da d del mes m del ao . Por ejemplo,

d QI IP PHHU ; 4lunes4
Solucin:

d d m a demn @@nmerohehs d m A mod UA


donde se usan las siguientes funciones auxiliares

nmeroh d m es el nmero de das trancurridos desde el 1 de enero del ao 0 hasta el da d del mes m del ao . Por ejemplo, nmerohehs QI IP PHHU ; UQQHRI nmerohehs d m a @EIABQTS C nmerohefisiestos C sum @tke @mEIA @meses AA C d

nmerohefisiestos es el nmero de aos bisiestos antes del ao .

2.26. Diferenciacin numrica

37

nmerohefisiestos a length @filter isiesto IFFEIA isiesto se verica si el ao es bisiesto. La denicin de ao bisiesto es
un ao divisible por 4 es un ao bisiesto (por ejemplo 1972); excepcin: si es divisible por 100, entonces no es un ao bisiesto excepcin de la excepcin: si es divisible por 400, entonces es un ao bisiesto (por ejemplo 2000).

isiesto a divisile R 88 @not@divisile IHHA || divisile RHHA meses es la lista con el nmero de das del los meses del ao . Por ejemplo, meses PHHH ; QIDPWDQIDQHDQIDQHDQIDQIDQHDQIDQHDQI meses a QID feD QID QHD QID QHD QID QID QHD QID QHD QI where fe | isiesto a PW | otherwise a PV demn n es el nsimo da de la semana comenzando con 0 el domingo. Por ejemplo, demn P ; 4mrtes4 demn demn demn demn demn demn demn H I P Q R S T a a a a a a a 4domingo4 4lunes4 4mrtes4 4miroles4 4jueves4 4viernes4 4sdo4

2.26.

Diferenciacin numrica

Ejercicio 2.26. Denir la funcin derivd tal que derivd f x es el valor de la derivada de la funcin f en el punto x con aproximacin . Por ejemplo,

38

Captulo 2. Nmeros y funciones

derivd HFHHI sin pi ; EHFWWWWPUQ derivd HFHHI os pi ; HFHHHRUTVQUI


Solucin:

derivd XX plot Eb @plot Eb plotA Eb plot Eb plot derivd f x a @f@xCAEf@xAAG


Ejercicio 2.27. Denir las siguientes versiones de derivd:

derivdfurd cuando la aproximacin es 0.01. derivdpin cuando la aproximacin es 0.0001. derivduper cuando la aproximacin es 0.000001.
Por ejemplo,

derivdpin os pi ; HFH derivdpin sin pi ; EHFWWVWUQV


Solucin:

derivdfurd a derivd HFHI derivdpin a derivd HFHHHI derivduper a derivd HFHHHHHI


Ejercicio 2.28. Denir la funcin derivdpinheleno tal que derivdpinheleno x es el valor de la derivada na del seno en x. Por ejemplo,

derivdpinheleno pi ; EHFWWVWUQV
Solucin:

derivdpinheleno a derivdpin sin

2.27.

Clculo de la raz cuadrada

Ejercicio 2.29. Denir la funcin izgudrd tal que riz x es la raz cuadrada de x calculada usando la siguiente propiedad x Si y es una aproximacin de x, entonces 1 2 ( y + y ) es una aproximacin mejor. Por ejemplo,

2.28. Clculo de ceros de una funcin

39

rizgudrd W ; QFHHHHHHHHIQWTWV
Solucin:

rizgudrd XX houle Eb houle rizgudrd x a until eptle mejorr I where mejorr y a HFSB@yCxGyA eptle y a s@yByExA ` HFHHHHI

2.28.

Clculo de ceros de una funcin

Ejercicio 2.30. Denir la funcin puntogero tal que puntogero f es un cero de la funcin f calculado usando la siguiente propiedad Si b es una aproximacin para el punto cero de f , entonces b aproximacin. Por ejemplo,
f (b) f (b)

es una mejor

puntogero os ; IFSUHUWT
Solucin:

puntogero f a until eptle mejorr I where mejorr a E f G derivdpin f eptle a s @f A ` HFHHHHI


Ejercicio 2.31. Usando puntogero, denir las siguientes funciones:

rzudrd tal que rzudrd x es la raz cuadrada de x. rzi tal que rzi x es la raz cbica de x. roseno tal que roseno x es el arco cuyo seno es x. rooseno tal que rooseno x es el arco cuyo coseno es x.
Solucin:

rzudrdI a puntogero f where f x a xBxE rziI a puntogero f where f x a xBxBxE

40

Captulo 2. Nmeros y funciones

rosenoI a puntogero f where f x a sin x E roosenoI a puntogero f where f x a os x E


Ejercicio 2.32. Usando puntogero, denir la funcin invers tal que invers f es la inversa de la funcin f. Solucin:

invers g a puntogero f where f x a g x E


Ejercicio 2.33. Usando la funcin invers, redenir las funciones rzudrd, rzi, roseno y rooseno. Solucin:

rzudrdP rziP rosenoP roosenoP

a a a a

invers invers invers invers

@PA @QA sin os

Captulo 3 Estructuras de datos


Contenido
3.1. Relacin de igualdad entre listas . . . . . . . . . . . . . . . . . . . . . . . 43 3.2. Concatenacin de listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3. Concatenacin de una lista de listas . . . . . . . . . . . . . . . . . . . . . 44 3.4. Cabeza de una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.5. Resto de una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.6. ltimo elemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.7. Lista sin el ltimo elemento . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.8. Segmento inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.9. Segmento inicial ltrado . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.10. Segmento nal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.11. Segmento nal ltrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.12. Nsimo elemento de una lista . . . . . . . . . . . . . . . . . . . . . . . . 50 3.13. Inversa de una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.14. Longitud de una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.15. Comprobacin de pertenencia de un elemento a una lista . . . . . . . . 53 3.16. Comprobacin de no pertenencia de un elemento a una lista . . . . . . 54 3.17. Comprobacin de que una lista est ordenada . . . . . . . . . . . . . . . 56 3.18. Comprobacin de la igualdad de conjuntos . . . . . . . . . . . . . . . . 57 3.19. Insercin ordenada de un elemento en una lista . . . . . . . . . . . . . . 58 3.20. Ordenacin por insercin . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.21. Mnimo elemento de una lista . . . . . . . . . . . . . . . . . . . . . . . . 61 3.22. Mezcla de dos listas ordenadas . . . . . . . . . . . . . . . . . . . . . . . . 62

41

42

Captulo 3. Estructuras de datos


3.23. Ordenacin por mezcla . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.24. Dgito correspondiente a un carcter numrico . . . . . . . . . . . . . . 64 3.25. Carcter correspondiente a un dgito . . . . . . . . . . . . . . . . . . . . 65 3.26. Lista innita de nmeros . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.27. Lista con un elemento repetido . . . . . . . . . . . . . . . . . . . . . . . . 66 3.28. Lista con un elemento repetido un nmero dado de veces . . . . . . . . 67 3.29. Iteracin de una funcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.30. Conversin de nmero entero a cadena . . . . . . . . . . . . . . . . . . . 68 3.31. Clculo de primos mediante la criba de Erasttenes . . . . . . . . . . . 69 3.32. Comprobacin de que todos los elementos son pares . . . . . . . . . . . 70 3.33. Comprobacin de que todos los elementos son impares . . . . . . . . . 71 3.34. Tringulos numricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 3.35. Posicin de un elemento en una lista . . . . . . . . . . . . . . . . . . . . 73 3.36. Ordenacin rpida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.37. Primera componente de un par . . . . . . . . . . . . . . . . . . . . . . . . 74 3.38. Segunda componente de un par . . . . . . . . . . . . . . . . . . . . . . . 75 3.39. Componentes de una terna . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.40. Creacin de variables a partir de pares . . . . . . . . . . . . . . . . . . . 76 3.41. Divisin de una lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.42. Sucesin de Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.43. Incremento con el mnimo . . . . . . . . . . . . . . . . . . . . . . . . . . 79 3.44. Longitud de camino entre puntos bidimensionales . . . . . . . . . . . . 80 3.45. Nmeros racionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 3.46. Mximo comn divisor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.47. Bsqueda en una lista de asociacin . . . . . . . . . . . . . . . . . . . . . 84 3.48. Emparejamiento de dos listas . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.49. Emparejamiento funcional de dos listas . . . . . . . . . . . . . . . . . . 86 3.50. Curricacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 3.51. Funciones sobre rboles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 3.52. Bsqueda en lista ordenada . . . . . . . . . . . . . . . . . . . . . . . . . . 90 3.53. Movimiento segn las direcciones . . . . . . . . . . . . . . . . . . . . . . 91 3.54. Los racionales como tipo abstracto de datos . . . . . . . . . . . . . . . . 91

3.1. Relacin de igualdad entre listas

43

3.1.

Relacin de igualdad entre listas

Ejercicio 3.1. Denir la funcin igulvist tal que igulvist xs ys se verica si las dos listas xs e ys son iguales. Por ejemplo,

igulvist XX iq ab Eb Eb fool igulvist IDPDQDRDS IFFS ; rue igulvist IDQDPDRDS IFFS ; plse
Nota: igulvist es equivalente a aa. Solucin:

igulvist igulvist igulvist igulvist

XX iq ab Eb Eb fool a rue @xXxsA @yXysA a xaay 88 igulvist xs ys a plse

Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni xs ys a igulvist xs ys aa @xsaaysA


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.2.

Concatenacin de listas

Ejercicio 3.2. Denir la funcin on tal que on lI lP es la concatenacin de lI y lP. Por ejemplo,

on PDQ QDPDRDI ; PDQDQDPDRDI


Nota: on es equivalente a @CCA. Solucin:

on XX Eb Eb on ys a ys on @xXxsA ys a x X @on xs ysA

44 Las deniciones son equivalentes:

Captulo 3. Estructuras de datos

propequivleni XX snt Eb snt Eb fool propequivleni xs ys a on xs ys aa xsCCys


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.3.

Concatenacin de una lista de listas

Ejercicio 3.3. Redenir la funcin ont tal que ont l es la concatenacin de las lista de l. Por ejemplo,

ont IDPDQDRDSDDIDP ; IDPDQDRDSDIDP


Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

ontI XX Eb ontI a ontI @xsXxssA a xs CC ontI xss


2. Denin con plegados:

ontP XX Eb ontP a foldr @CCA


3. Denin por comprensin:

ontQ XX Eb ontQ xss a x | xs `E xssD x `E xs


Las deniciones son equivalentes:

propequivleni propequivleni ontI x aa ontP x aa ontQ x aa

XX snt Eb fool x a ont x 88 ont x 88 ont x

3.4. Cabeza de una lista Comprobacin:

45

winb quikghek propequivleni yuD pssed IHH testsF

3.4.

Cabeza de una lista

Ejercicio 3.4. Redenir la funcin hed tal que hed l es la cabeza de la lista l. Por ejemplo,

hed QDSDP ; Q hed ; rogrm errorX pttern mth filureX hed


Solucin:

nhed XX Eb nhed @xXA a x

3.5.

Resto de una lista

Ejercicio 3.5. Redenir la funcin til tal que til l es el resto de la lista l. Por ejemplo,

til QDSDP ; SDP til @til IA ; rogrm errorX pttern mth filureX til
Solucin:

ntil XX Eb ntil @XxsA a xs

3.6.

ltimo elemento

Ejercicio 3.6. Redenir la funcin lst tal que lst l es el ltimo elemento de la lista l. Por ejemplo,

lst IDPDQ ; Q lst ; rogrm errorX pttern mth filureX lst


Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

46

Captulo 3. Estructuras de datos

nlstI XX Eb nlstI x a x nlstI @XxsA a nlstI xs


2. Con plegados:

nlstP XX Eb nlstP a foldrI @x y Eb yA


3. Con hed y reverse:

nlstQ XX Eb nlstQ xs a hed @reverse xsA


4. Con hed, reverse y @FA:

nlstR XX Eb nlstR a hed F reverse


5. Con @33A y length

nlstS XX Eb nlstS xs a xs 33 @length xs E IA


Las deniciones son equivalentes para las listas no vaca:

propequivleni XX snt Eb roperty propequivleni xs a not @null xsA aab @nlstI xs aa lst xs 88 nlstP xs aa lst xs 88 nlstQ xs aa lst xs 88 nlstR xs aa lst xs 88 nlstS xs aa lst xsA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.7. Lista sin el ltimo elemento

47

3.7.

Lista sin el ltimo elemento

Ejercicio 3.7. Redenir la funcin init tal que init l es la lista l sin el ltimo elemento. Por ejemplo,

init IDPDQ ; IDP init R ;


Solucin: Presentamos distintas deniciones: 1. Denicin recursiva:

ninitI XX Eb ninitI x a ninitI @xXxsA a x X ninitI xs


2. Denicin con til y reverse:

ninitP XX Eb ninitP xs a reverse @til @reverse xsAA


3. Denicin con til, reverse y @FA:

ninitQ XX Eb ninitQ a reverse F til F reverse


Las deniciones son equivalentes sobre listas no vaca:

propequivleni XX snt Eb roperty propequivleni xs a not @null xsA aab @ninitI xs aa init xs 88 ninitP xs aa init xs 88 ninitQ xs aa init xsA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

48

Captulo 3. Estructuras de datos

3.8.

Segmento inicial

Ejercicio 3.8. Denir la funcin tke tal que tke n l es la lista de los n primeros elementos de l. Por ejemplo,

tke P QDSDRDU ; QDS tke IP QDSDRDU ; QDSDRDU


Solucin:

ntke ntke ntke ntke

XX snt Eb n | n `a H n @xXxsA

Eb a a a

x X ntke @nEIA xs

Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni n xs a ntke n xs aa tke n xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.9.

Segmento inicial ltrado

Ejercicio 3.9. Redenir la funcin tkehile tal que tkehile p l es la lista de los elementos iniciales de l que verican el predicado p. Por ejemplo,

tkehile even PDRDTDUDVDW ; PDRDT


Solucin: Denicin recursiva:

ntkehile XX @ Eb foolA Eb Eb ntkehile p a ntkehile p @xXxsA | p x a x X ntkehile p xs | otherwise a


Las deniciones son equivalentes:

3.10. Segmento nal

49

propequivleni XX snt Eb fool propequivleni xs a ntkehile even xs aa tkehile even xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.10.

Segmento nal

Ejercicio 3.10. Redenir la funcin drop tal que drop n l es la lista obtenida eliminando los primeros n elementos de la lista l. Por ejemplo,

drop P QFFIH ; SDTDUDVDWDIH drop IP QFFIH ;


Solucin:

ndrop ndrop ndrop ndrop

XX snt Eb n xs | n `a H n @XxsA

Eb a xs a a ndrop @nEIA xs

Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni n xs a ndrop n xs aa drop n xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


La relacin entre los segmentos iniciales y nales es

proptkeydrop XX snt Eb snt Eb fool proptkeydrop n xs a ntke n xs CC ndrop n xs aa xs


Comprobacin

winb quikghek proptkeydrop yuD pssed IHH testsF

50

Captulo 3. Estructuras de datos

3.11.

Segmento nal ltrado

Ejercicio 3.11. Redenir la funcin drophile tal que drophile p l es la lista l sin los elementos iniciales que verican el predicado p. Por ejemplo,

drophile even PDRDTDUDVDW ; UDVDW


Solucin:

ndrophile XX @ Eb foolA Eb Eb ndrophile p a ndrophile p ld@xXxsA | p x a ndrophile p xs | otherwise a l


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a ndrophile even xs aa drophile even xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.12.

Nsimo elemento de una lista

Ejercicio 3.12. Denir la funcin nth tal que nth l n es elemento nsimo de l, empezando a numerar con el 0. Por ejemplo,

nth IDQDPDRDWDU Q ; R
Nota: nth es equivalente a @33A. Solucin:

nth XX Eb snt Eb nth @xXA H a x nth @XxsA n a nth xs @nEIA


Las deniciones son equivalentes:

3.13. Inversa de una lista

51

propequivleni XX snt Eb snt Eb roperty propequivleni xs n a H ` n 88 n ` length xs aab nth xs n aa xs33n


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.13.

Inversa de una lista

Ejercicio 3.13. Redenir la funcin reverse tal que reverse l es la inversa de l. Por ejemplo,

reverse IDRDPDS ; SDPDRDI


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

nreverseI XX Eb nreverseI a nreverseI @xXxsA a nreverseI xs CC x


2. Denicin recursiva con acumulador:

nreverseP XX Eb nreverseP xs a nreversePux xs where nreversePux ys a ys nreversePux @xXxsA ys a nreversePux xs @xXysA


3. Con plegado:

nreverseQ XX Eb nreverseQ a foldl @flip @XAA


Las deniciones son equivalentes:

propequivleni XX snt Eb propequivleni xs a nreverseI xs aa reverse nreverseP xs aa reverse nreverseQ xs aa reverse

fool xs 88 xs 88 xs

52 Comprobacin

Captulo 3. Estructuras de datos

winb quikghek propequivleni yuD pssed IHH testsF


Comparacin de eciencia : Nmero de reducciones al invertir la lista IFFn n Def. 1 Def. 2 Def. 3 100 7.396 2.347 2.446 200 24.746 4.647 4.846 400 89.446 9.247 9.646 1000 523.546 23.047 24.046

3.14.

Longitud de una lista

Ejercicio 3.14. Redenir la funcin length tal que length l es el nmero de elementos de l. Por ejemplo,

length IDQDT ; Q
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

nlengthI XX Eb snt nlengthI a H nlengthI @XxsA a I C nlengthI xs


2. Denicin con plegado por la derecha:

nlengthP XX Eb snt nlengthP a foldr @x y Eb yCIA H


3. Denicin con plegado por la izquierda:

nlengthQ XX Eb snt nlengthQ a foldl @x y Eb xCIA H


4. Denicin con sum y listas intensionales:

nlengthR XX Eb snt nlengthR xs a sum I | x `E xs

3.15. Comprobacin de pertenencia de un elemento a una lista Las deniciones son equivalentes:

53

propequivleni propequivleni nlengthI xs nlengthP xs nlengthQ xs nlengthR xs


Comprobacin

XX xs aa aa aa aa

snt Eb fool a length xs 88 length xs 88 length xs 88 length xs

winb quikghek propequivleni yuD pssed IHH testsF

3.15.

Comprobacin de pertenencia de un elemento a una lista

Ejercicio 3.15. Redenir la funcin elem tal que elem e l se verica si e es un elemento de l. Por ejemplo,

elem P IDPDQ ; rue elem R IDPDQ ; plse


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva

nelemI XX iq ab Eb Eb fool nelemI a plse nelemI x @yXysA a @xaayA || nelemI x ys


2. Denicin con plegado:

nelemP XX iq ab Eb Eb fool nelemP x a foldl @z y Eb z || xaayA plse


3. Denicin con or y mp

nelemQ XX iq ab Eb Eb fool nelemQ x ys a or @mp @aaxA ysA


4. Denicin con or, mp y @FA

54

Captulo 3. Estructuras de datos

nelemR XX iq ab Eb Eb fool nelemR x a or F mp @aaxA


5. Denicin con or y lista intensional:

nelemS XX iq ab Eb Eb fool nelemS x ys a or xaay | y `E ys


6. Denicin con ny y @FA

nelemT XX iq ab Eb Eb fool nelemT a ny F @aaA


7. Denicin con not y notilem

nelemU XX iq ab Eb Eb fool nelemU x a not F @notilem xA


Las deniciones son equivalentes:

propequivleni propequivleni nelemI x ys nelemP x ys nelemQ x ys nelemR x ys nelemS x ys nelemT x ys nelemU x ys


Comprobacin

XX snt Eb x ys a aa elem x aa elem x aa elem x aa elem x aa elem x aa elem x aa elem x

snt Eb fool ys ys ys ys ys ys ys 88 88 88 88 88 88

winb quikghek propequivleni yuD pssed IHH testsF

3.16.

Comprobacin de no pertenencia de un elemento a una lista

Ejercicio 3.16. Redenir la funcin notilem tal que notilem e l se verica si e no es un elemento de l. Por ejemplo,

3.16. Comprobacin de no pertenencia de un elemento a una lista

55

notilem P IDPDQ ; plse notilem R IDPDQ ; rue


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva

nnotilemI XX iq ab Eb Eb fool nnotilemI a rue nnotilemI x @yXysA a @xGayA 88 nnotilemI x ys


2. Denicin con plegado:

nnotilemP XX iq ab Eb Eb fool nnotilemP x a foldl @z y Eb z 88 xGayA rue


3. Denicin con or y mp

nnotilemQ XX iq ab Eb Eb fool nnotilemQ x ys a nd @mp @GaxA ysA


4. Denicin con or, mp y @FA

nnotilemR XX iq ab Eb Eb fool nnotilemR x a nd F mp @GaxA


5. Denicin con or y lista intensional:

nnotilemS XX iq ab Eb Eb fool nnotilemS x ys a nd xGay | y `E ys


6. Denicin con ny y @FA

nnotilemT XX iq ab Eb Eb fool nnotilemT a ll F @GaA


7. Denicin con not y elem

nnotilemU XX iq ab Eb Eb fool nnotilemU x a not F @elem xA


Las deniciones son equivalentes:

56

Captulo 3. Estructuras de datos

propequivleni propequivleni nnotilemI x nnotilemP x nnotilemQ x nnotilemR x nnotilemS x nnotilemT x nnotilemU x


Comprobacin

XX snt Eb snt x ys a ys aa notilem x ys aa notilem x ys aa notilem x ys aa notilem x ys aa notilem x ys aa notilem x ys aa notilem x

Eb fool ys ys ys ys ys ys ys 88 88 88 88 88 88

winb quikghek propequivleni yuD pssed IHH testsF

3.17.

Comprobacin de que una lista est ordenada

Ejercicio 3.17. Denir la funcin listordend tal que listordend l se verica si la lista l est ordenada de menor a mayor. Por ejemplo,

listordend IDQDQDS ; rue listordend IDQDSDQ ; plse


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva

listordendI listordendI listordendI listordendI

XX yrd @xXyXxsA

ab Eb fool a rue a rue a @x `a yA 88 listordendI @yXxsA

2. Denicin con nd, y zipith

listordendP listordendP listordendP listordendP

XX yrd ab Eb fool a rue a rue xs a nd @zipith @`aA xs @til xsAA

3. Usaremos como listordend la primera

3.18. Comprobacin de la igualdad de conjuntos

57

listordend XX yrd ab Eb fool listordend a listordendI


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a listordendI xs aa listordendP xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.18.

Comprobacin de la igualdad de conjuntos

Ejercicio 3.18. Denir la funcin igulonjunto tal que igulonjunto lI lP se verica si las listas lI y lP vistas como conjuntos son iguales Por ejemplo,

igulonjunto IFFIH IHDWFFI ; rue igulonjunto IFFIH IIDIHFFI ; plse


Solucin: Se presentan distintas deniciones: 1. Usando suonjunto

igulonjuntoI XX iq ab Eb Eb fool igulonjuntoI xs ys a suonjunto xs ys 88 suonjunto ys xs


2. Por recursin.

igulonjuntoP XX iq ab Eb Eb fool igulonjuntoP xs ys a ux @nu xsA @nu ysA where ux a rue ux @xXA a plse ux @yXA a plse ux @xXxsA ys a x elem ys 88 ux xs @delete x ysA
3. Usando sort

igulonjuntoQ XX @iq D yrd A ab Eb Eb fool igulonjuntoQ xs ys a sort @nu xsA aa sort @nu ysA

58 4. Usaremos como igulonjunto la primera

Captulo 3. Estructuras de datos

igulonjunto XX iq ab Eb Eb fool igulonjunto a igulonjuntoI


Las deniciones son equivalentes:

propequivleni XX propequivleni xs igulonjuntoP igulonjuntoQ


Comprobacin

snt Eb snt Eb fool ys a xs ys aa igulonjuntoI xs ys 88 xs ys aa igulonjuntoI xs ys

winb quikghek propequivleni yuD pssed IHH testsF

3.19.

Insercin ordenada de un elemento en una lista

Ejercicio 3.19. Denir la funcin insert tal que insert e l inserta el elemento e en la lista l delante del primer elemento de l mayor o igual que e. Por ejemplo,

insert S PDRDUDQDTDVDIH ; PDRDSDUDQDTDVDIH


Solucin:

insert XX yrd insert e insert e @xXxsA | e`ax | otherwise

ab Eb Eb a e a eXxXxs a x X insert e xs

Se puede denir el generador de QuickCheck para que cree lista ordenadas y compruebe que insert las mantiene ordenada

listyrdend XX qen snteger listyrdend a do n `E ritrry listhesde n where listhesde n a frequeny @ID return AD

3.20. Ordenacin por insercin

59

@SD do i `E ritrry ns `E listhesde @nCs iA return @nXnsAA propinsert x a forell listyrdend 6 xs Eb ollet @length xsA 6 listordend @insert x xsA
En efecto,

snsertb quikghek propinsert yuD pssed IHH testsF IV7 PF IT7 IF IH7 SF IH7 HF W7 TF U7 UF U7 QF R7 WF R7 IPF Q7 RF P7 VF P7 IWF P7 IQF I7 PPF I7 IVF I7 IUF I7 ISF I7 IIF I7 IHF

3.20.

Ordenacin por insercin

Ejercicio 3.20. Denir la funcin ordenporinserin tal que ordenporinserin l es la lista l ordenada mediante insercin, Por ejemplo,

ordenporinserin PDRDQDTDQ ; PDQDQDRDT


Solucin: Se presentan distintas deniciones:

60 1. Denicin recursiva

Captulo 3. Estructuras de datos

ordenporinserinI XX yrd ab Eb ordenporinserinI a ordenporinserinI @xXxsA a insert x @ordenporinserinI xsA


2. Denicin por plegado por la derecha

ordenporinserinP XX yrd ab Eb ordenporinserinP a foldr insert


3. Denicin por plegado por la izquierda

ordenporinserinQ XX yrd ab Eb ordenporinserinQ a foldl @flip insertA


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a ordenporinserinP xs aa ordenporinserinI xs 88 ordenporinserinP xs aa ordenporinserinI xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


Al comparar la eciencia

winb Xset Cs winb ordenporinserinI IHHDWWFFI DDD @SIWSW redutionsD TVIQP ellsA winb ordenporinserinP IHHDWWFFI DDD @SIWTH redutionsD TVHQR ellsA winb ordenporinserinQ IHHDWWFFI FFF @QRSI redutionsD SIUP ellsA
se observa que la tercera denicin es ms eciente. En los sucesivo usaremos como ordenporinserin la tercera

3.21. Mnimo elemento de una lista

61

ordenporinserin XX yrd ab Eb ordenporinserin a ordenporinserinP


El valor de ordenporinserin es una lista ordenada

propordenporinserinordend XX snt Eb fool propordenporinserinordend xs a listordend @ordenporinserin xsA yrdenporinserionb quikghek propordenporinserinordend yuD pssed IHH testsF

3.21.

Mnimo elemento de una lista

Ejercicio 3.21. Redenir la funcin minimum tal que minimum l es el menor elemento de la lista l. Por ejemplo,

minimum QDPDS ; P
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

nminimumI XX yrd ab Eb nminimumI x a x nminimumI @xXyXxsA a nminimumI @@min x yAXxsA


2. Denicin con plegado:

nminimumP XX yrd ab Eb nminimumP a foldlI min


3. Denicin mediante ordenacin:

nminimumQ XX yrd ab Eb nminimumQ a hed F ordenporinserin


Las deniciones son equivalentes:

62

Captulo 3. Estructuras de datos

propequivleni XX snt Eb roperty propequivleni xs a not @null xsA aab @nminimumI xs aa minimum xs 88 nminimumP xs aa minimum xs 88 nminimumQ xs aa minimum xs A
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


La eciencia de las tres deniciones es equivalente:

win Xset Cs winb nminimumI I @PTRR redutionsD winb nminimumP I @PSRV redutionsD winb nminimumQ I @PSSP redutionsD minimumQ minimumQ minimumQ minimumQ

IHHDWWFFI QSTV ellsA IHHDWWFFI QQUQ ellsA IHHDWWFFI QRUU ellsA @ QHH @ PSSH @ PSHSH @PSHHSH redutionsD RIT ellsA redutionsD QRUT ellsA redutionsD QRHUT ellsA redutionsD QRHHUU ellsA @ USH @ SIWTH @ SHIWHTH @SHHIWHHTH redutionsD IHPV redutionsD TVHQR redutionsD TSQHRVS redutionsD TSHQIQWVU ellsA ellsA ellsA ellsA

La complejidad de minimumQ es lineal:

IHDWFFI IHHDWWFFI IHHHDWWWFFI IHHHHDWWWWFFI

aunque la complejidad de ordenporinserin es cuadrtica

ordenporinserin ordenporinserin ordenporinserin ordenporinserin

IHDWFFI IHHDWWFFI IHHHDWWWFFI IHHHHDWWWWFFI

3.22.

Mezcla de dos listas ordenadas

Ejercicio 3.22. Denir la funcin mezl tal que mezl lI lP es la lista ordenada obtenida al mezclar las listas ordenadas lI y lP. Por ejemplo,

3.22. Mezcla de dos listas ordenadas

63

mezl IDQDS PDW ; IDPDQDSDW


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

mezlI XX yrd ab mezlI ys a mezlI xs a mezlI @xXxsA @yXysA | x `a y a x | otherwise a y

Eb Eb ys xs X mezlI xs @yXysA X mezlI @xXxsA ys

2. Denicin recursiva con insert:

mezlP XX yrd ab Eb Eb mezlP ys a ys mezlP @xXxsA ys a insert x @mezlP xs ysA


3. Usaremos como mezl la primera

mezl XX yrd ab Eb Eb mezl a mezlI


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni xs ys a mezlI xs ys aa mezlP xs ys


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


Las mezcla de listas ordenadas es una lista ordenada

propmezlordend XX snt Eb snt Eb roperty propmezlordend xs ys a listordend xs 88 listordend ys aab listordend @mezl xs ysA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

64

Captulo 3. Estructuras de datos

3.23.

Ordenacin por mezcla

Ejercicio 3.23. Denir la funcin ordenporm tal que ordenporm l es la lista l ordenada mediante mezclas, Por ejemplo,

ordenporm PDRDQDTDQ ; PDQDQDRDT


Solucin: Denicin recursiva

ordenporm XX yrd ab Eb ordenporm a ordenporm x a x ordenporm xs a mezl @ordenporm ysA @ordenporm zsA where medio a @length xsA div P ys a tke medio xs zs a drop medio xs
El valor de ordenporm es una lista ordenada

propordenpormordend XX snt Eb fool propordenpormordend xs a listordend @ordenporm xsA hb quikghek propordenpormordend yuD pssed IHH testsF

3.24.

Dgito correspondiente a un carcter numrico

Ejercicio 3.24. Denir la funcin dgitohegrter tal que dgitohegrter es el dgito correspondiente al carcter numrico . Por ejemplo,

dgitohegrter 9Q9 ; Q
Solucin:

dgitohegrter XX ghr Eb snt dgitohegrter a ord E ord 9H9

3.25. Carcter correspondiente a un dgito

65

3.25.

Carcter correspondiente a un dgito

Ejercicio 3.25. Denir la funcin rterhehgito tal que rterhehgito n es el carcter correspondiente al dgito n. Por ejemplo,

rterhehgito Q ; 9Q9
Solucin:

rterhehgito XX snt Eb ghr rterhehgito n a hr @n C ord 9H9A


La funcin rterhehgito es inversa de dgitohegrter

propinvers XX fool propinvers a nd dgitohegrter@rterhehgito dAaad | d `E HFFW


Comprobacin

propinvers ; rue

3.26.

Lista innita de nmeros

Ejercicio 3.26. Denir la funcin desde tal que desde n es la lista de los nmeros enteros a partir de n. Por ejemplo,

desde S

; SDTDUDVDWDIHDIIDIPDIQDIRD{snterrupted3}

se interrumpe con gontrolEg. Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

desdeI XX snt Eb snt desdeI n a n X desdeI @nCIA


2. Denicin con segmento numrico:

desdeP XX snt Eb snt desdeP n a nFF


Las deniciones son equivalentes:

66

Captulo 3. Estructuras de datos

propequivleni XX snt Eb snt Eb fool propequivleni n m a tke m @desdeI nA aa tke m @desdeP nA


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.27.

Lista con un elemento repetido

Ejercicio 3.27. Redenir la funcin repet tal que repet x es una lista innita con el nico elemento x. Por ejemplo,

repet 99 ; 4{snterrupted3}
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

nrepetI XX Eb nrepetI x a x X nrepetI x


2. Denicin recursiva con entorno local

nrepetP XX Eb nrepetP x a xs where xs a xXxs


3. Denicin con lista de comprensin:

nrepetQ XX Eb nrepetQ x a x | y `E IFF


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni n m a tke n @nrepetI mA aa tke n @repet mA 88 tke n @nrepetP mA aa tke n @repet mA 88 tke n @nrepetQ mA aa tke n @repet mA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.28. Lista con un elemento repetido un nmero dado de veces

67

3.28.

Lista con un elemento repetido un nmero dado de veces

Ejercicio 3.28. Redenir la funcin replite tal que replite n x es una lista con n copias del elemento x. Por ejemplo,

replite IH Q ; QDQDQDQDQDQDQDQDQDQ replite @EIHA Q ;


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

nrepliteI XX snt Eb Eb nrepliteI @nCIA x a x X nrepliteI n x nrepliteI x a


2. Denicin por comprensin:

nrepliteP XX snt Eb Eb nrepliteP n x a x | y `E IFFn


3. Denicin usando tke y repet:

nrepliteQ XX snt Eb Eb nrepliteQ n x a tke n @repet xA


Las deniciones son equivalentes:

propequivleni propequivleni nrepliteI nrepliteP nrepliteQ


Comprobacin

XX snt n m a n m aa n m aa n m aa

Eb snt Eb fool replite n m 88 replite n m 88 replite n m

winb quikghek propequivleni yuD pssed IHH testsF

68

Captulo 3. Estructuras de datos

3.29.

Iteracin de una funcin

Ejercicio 3.29. Redenir la funcin iterte tal que iterte f x es la lista cuyo primer elemento es x y los siguientes elementos se calculan aplicando la funcin f al elemento anterior. Por ejemplo,

iterte @CIA Q ; QDRDSDTDUDVDWDIHDIIDIPD{snterrupted3} iterte @BPA I ; IDPDRDVDITDQPDTRD{snterrupted3} iterte @div IHA IWUP ; IWUPDIWUDIWDIDHDHDHDHDHDHD{snterrupted3}
Solucin:

niterte XX @ Eb A Eb Eb niterte f x a x X niterte f @f xA


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni n m a tke n @niterte @CIA mA aa tke n @iterte @CIA mA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.30.

Conversin de nmero entero a cadena

Ejercicio 3.30. Denir la funcin deinteroegden tal que deinteroegden n es la cadena correspondiente al nmero entero n. Por ejemplo,

deinteroegden IWUP ; 4IWUP4


Solucin: Se presentan distintas deniciones: 1. Mediante composicin de funciones:

deinteroegdenI XX snt Eb tring deinteroegdenI a mp rterhehgito F reverse F mp @rem IHA F tkehile @Ga HA F iterte @div IHA

3.31. Clculo de primos mediante la criba de Erasttenes Ejemplo de clculo

69

iterte @div IHA IWUP ; IWUPDIWUDIWDIDHDHDHDFFF @tkehile @Ga HA F iterte @div IHAA IWUP ; IWUPDIWUDIWDI mp @rem IHA IWUPDIWUDIWDI ; PDUDWDI reverse PDUDWDI ; IDWDUDP mp rterhehgito IDWDUDP ; 4IWUP4
2. Mediante la funcin show

deinteroegdenP XX snt Eb tring deinteroegdenP a show


Las deniciones son equivalentes:

propequivleni XX snt Eb roperty propequivleni n a n b H aab deinteroegdenI n aa deinteroegdenP n


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.31.

Clculo de primos mediante la criba de Erasttenes

Ejercicio 3.31. Denir la funcin primosporri tal que primosporri es la lista de los nmeros primos mediante la criba de Erasttenes.

primosporri ; PDQDSDUDIIDIQDIUDIWDPQDPWD{snterrupted3} tke IH primosporri ; PDQDSDUDIIDIQDIUDIWDPQDPW


Solucin: Se presentan distintas deniciones: 1. Denicin perezosa:

primosporriI XX snt primosporriI a mp hed @iterte eliminr PFFA where eliminr @xXxsA a filter @nomultiplo xA xs nomultiplo x y a y mod x Ga H
Para ver el clculo, consideramos la siguiente variacin

70

Captulo 3. Estructuras de datos

primosporriIux a mp @tke IHA @iterte eliminr PFFA where eliminr @xXxsA a filter @nomultiplo xA xs nomultiplo x y a y mod x Ga H
Entonces,

winb tke S primosporriIux PD QD RD SD TD UD VD WDIHDIID QD SD UD WDIIDIQDISDIUDIWDPID SD UDIIDIQDIUDIWDPQDPSDPWDQID UDIIDIQDIUDIWDPQDPWDQIDQUDRID IIDIQDIUDIWDPQDPWDQIDQUDRIDRQ


2. Denicin por comprensin:

primosporriP XX snt primosporriP a ri PFF where ri @pXxsA a p X ri n | n`ExsD n mod p Ga H


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni n a tke n primosporriI aa tke n primosporriP


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.32.

Comprobacin de que todos los elementos son pares

Ejercicio 3.32. Denir la funcin todosres tal que

todosres xs se verica si todos los elementos de la lista xs son pares. Por ejemplo, todosres PDRDT ; rue todosres PDRDTDU ; plse
Solucin: Se presentan distintas deniciones:

3.33. Comprobacin de que todos los elementos son impares 1. Denicin recursiva:

71

todosresI XX snt Eb fool todosresI a rue todosresI @xXxsA a even x 88 todosresI xs


2. Denicin con ll:

todosresP XX snt Eb fool todosresP a ll even


3. Denicin por comprensin:

todosresQ XX snt Eb fool todosresQ xs a @x | x`ExsD even x aa xsA


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a todosresP xs aa todosresI xs 88 todosresQ xs aa todosresI xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.33.

Comprobacin de que todos los elementos son impares

Ejercicio 3.33. Denir la funcin todossmpres tal que

todossmpres xs se verica si todos los elementos de la lista xs son impares. Por ejemplo, todossmpres IDQDS ; rue todossmpres IDQDSDT ; plse
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

72

Captulo 3. Estructuras de datos

todossmpresI XX snt Eb fool todossmpresI a rue todossmpresI @xXxsA a odd x 88 todossmpresI xs


2. Denicin con ll:

todossmpresP XX snt Eb fool todossmpresP a ll odd


3. Denicin por comprensin:

todossmpresQ XX snt Eb fool todossmpresQ xs a @x | x`ExsD odd x aa xsA


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a todossmpresP xs aa todossmpresI xs 88 todossmpresQ xs aa todossmpresI xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.34.

Tringulos numricos

Ejercicio 3.34. Denir la funcin tringulo tal que tringulo n es la lista de las lista de nmeros consecutivos desde I hasta IDPDFFFDn. Por ejemplo,

tringulo R ; IDIDPDIDPDQDIDPDQDR
Solucin: Denicin por comprensin:

tringulo XX snt Eb snt tringulo n a IFFx | x `E IFFn

3.35. Posicin de un elemento en una lista

73

3.35.

Posicin de un elemento en una lista

Ejercicio 3.35. Denir la funcin posiin tal que posiin x ys es la primera posicin del elemento x en la lista ys y H en el caso de que no pertenezca a la lista. Por ejemplo,

posiin S IDSDQDSDTDSDQDR ; P
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

posiinI XX iq ab Eb Eb snt posiinI x ys a if elem x ys then ux x ys else H where ux x a H ux x @yXysA | xaa y a I | otherwise a I C ux x ys
2. Denicin con listas de comprensin:

posiinP XX iq ab Eb Eb snt posiinP x xs a hed @pos | @yDposA `E zip xs IFFlength xsD y aa x CC HA


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni x xs a posiinI x xs aa posiinP x xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


Usaremos como posiin la primera

posiinXX iq ab Eb Eb snt posiin a posiinI

74

Captulo 3. Estructuras de datos Se verica las siguiente propiedad: El elemento en la posicin de x en xs es x:

propposiin XX snt Eb snt Eb fool propposiin x xs a let naposiin x xs in if naaH then notilem x xs else xs33@nEIAaax

3.36.

Ordenacin rpida

Ejercicio 3.36. Denir la funcin orden tal que orden xs es la lista xs ordenada mediante el procedimiento de ordenacin rpida. Por ejemplo,

orden SDPDUDUDSDIWDQDVDT ; PDQDSDSDTDUDUDVDIW


Solucin:

orden XX yrd ab Eb orden a orden @xXxsA a orden menores CC x CC orden myores where menores a e | e`ExsD e`x myores a e | e`ExsD ebax
El valor de orden es una lista ordenada

propordenordend XX snt Eb fool propordenordend xs a listordend @orden xsA yrdenporinserionb quikghek propordenordend yuD pssed IHH testsF

3.37.

Primera componente de un par

Ejercicio 3.37. Redenir la funcin fst tal que fst p es la primera componente del par p. Por ejemplo,

fst @QDPA ; Q
Solucin:

3.38. Segunda componente de un par

75

nfst XX @DA Eb nfst @xDA a x


Las deniciones son equivalentes:

propequivleni XX @sntDsntA Eb fool propequivleni p a nfst p aa fst p


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.38.

Segunda componente de un par

Ejercicio 3.38. Redenir la funcin snd tal que snd p es la segunda componente del par p. Por ejemplo,

snd @QDPA ; P
Solucin:

nsnd XX @DA Eb nsnd @DyA a y


Las deniciones son equivalentes:

propequivleni XX @sntDsntA Eb fool propequivleni p a nsnd p aa snd p


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

76

Captulo 3. Estructuras de datos

3.39.

Componentes de una terna

Ejercicio 3.39. Redenir las siguientes funciones

fstQ t es la primera componente de la terna t. sndQ t es la segund componente de la terna t. thdQ t es la tercera componente de la terna t.
Por ejemplo,

fstQ @QDPDSA ; Q sndQ @QDPDSA ; P thdQ @QDPDSA ; S


Solucin:

nfstQ XX @DDA Eb nfstQ @xDDA a x nsndQ XX @DDA Eb nsndQ @DyDA a y nthdQ XX @DDA Eb nthdQ @DDzA a z
Se verica la siguiente propiedad:

propterns XX @sntDsntDsntA Eb fool propterns x a @nfstQ xD nsndQ xD nthdQ xA aa x


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.40.

Creacin de variables a partir de pares

Ejercicio 3.40. Denir la funcin vrile tal que vrile p es la cadena correspondiente al par p formado por un carcter y un nmero. Por ejemplo,

vrile @9x9DQA ; 4xQ4

3.41. Divisin de una lista Solucin:

77

vrile XX @ghrDsntA Eb tring vrile @DnA a CC show n

3.41.

Divisin de una lista

Ejercicio 3.41. Redenir la funcin splitet tal que splitet n l es el par formado por la lista de los n primeros elementos de la lista l y la lista l sin los n primeros elementos. Por ejemplo,

splitet Q SDTDUDVDWDPDQ ; @SDTDUDVDWDPDQA splitet R 4sorho4 ; @4s4D4orho4A


Solucin:

nsplitet nsplitet nsplitet nsplitet where

XX snt Eb Eb @D A n xs | n `a H a @DxsA a @DA n @xXxsA a @xXxs9Dxs99A @xs9Dxs99A a nsplitet @nEIA xs

Se verica la siguiente propiedad:

propsplitet XX snt Eb snt Eb fool propsplitet n xs a nsplitet n xs aa @tke n xsD drop n xsA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.42.

Sucesin de Fibonacci

Ejercicio 3.42. Denir la funcin fi n tal que fi n es el nsimo trmino de la sucesin de Fibonacci 1,1,2,3,5,8,13,21,34,55,. . . Por ejemplo,

fi S

vlor

Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

78

Captulo 3. Estructuras de datos

fiI fiI fiI fiI

XX snt Eb snt H a I I a I @nCPA a fiI n C fiI @nCIA

2. Denicin con acumuladores:

fiP XX snt Eb snt fiP n a fiPux n I I where fiPux H p q a p fiPux @nCIA p q a fiPux n q @pCqA
3. Denicin con mediante listas innitas:

fiQ XX snt Eb snt fiQ n a fis33n


donde fis es la sucesin de los nmeros de Fibonacci.

fis XX snt fis a I X I X C | @DA `E zip fis @til fisA


Las deniciones son equivalentes:

propequivleni XX fool propequivleni a fiI n | n `E IFFPH aa fiP n | n `E IFFPH 88 fiQ n | n `E IFFPH aa fiP n | n `E IFFPH
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


La complejidad de fiI es O( f ib(n)) y la de fiP y fiQ es O(n), como se observa en la siguiente tabla donde se muestra el nmero de reducciones n fiI fiP fiQ 2 85 96 76 4 241 158 114 8 1.741 282 190 16 82.561 530 342 32 182.249.581 1.026 706

3.43. Incremento con el mnimo

79

3.43.

Incremento con el mnimo

Ejercicio 3.43. Denir la funcin inmin tal que inmin l es la lista obtenida aadiendo a cada elemento de l el menor elemento de l. Por ejemplo,

inmin QDIDRDIDSDWDPDT ; RDPDSDPDTDIHDQDU


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva

inminI XX snt Eb snt inminI l a mp @CeA l where e a mnimo l mnimo x a x mnimo @xXyXxsA a min x @mnimo @yXxsAA
2. Con la denicin anterir se recorre la lista dos veces: una para calcular el mnimo y otra para sumarlo. Con la siguiente denicin la lista se recorre slo una vez.

inminP XX snt Eb snt inminP a inminP l a nuevlist where @minvD nuevlistA a unpso l unpso x a @xD xCminvA unpso @xXxsA a @min x yD @xCminvAXysA where @yDysA a unpso xs
Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a inminI xs aa inminP xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

80

Captulo 3. Estructuras de datos

3.44.

Longitud de camino entre puntos bidimensionales

Ejercicio 3.44. Denir el tipo unto como un par de nmeros reales Por ejemplo,

@QFHDRFHA XX unto
Solucin:

type unto a @houleD houleA


Ejercicio 3.45. Denir la funcin distnilorigen tal que distnilorigen p es la distancia del punto p al origen. Por ejemplo,

distnilorigen @QDRA ; SFH


Solucin:

distnilorigen XX unto Eb houle distnilorigen @xDyA a sqrt @xBxCyByA


Ejercicio 3.46. Denir la funcin distni tal que distni pI pP es la distancia entre los puntos pI y pP. Por ejemplo,

distni @PDRA @SDVA ; SFH


Solucin:

distni XX unto Eb unto Eb houle distni @xDyA @x9Dy9A a sqrt@@xEx9APC@yEy9APA


Ejercicio 3.47. Denir el tipo gmino como una lista de puntos Por ejemplo,

@IDPAD@RDTAD@UDIHA XX gmino
Solucin:

type gmino a unto


Ejercicio 3.48. Denir la funcin longitudmino tal que longitudmino es la longitud del camino . Por ejemplo,

longitudmino @IDPAD@RDTAD@UDIHA ; IHFH


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

3.45. Nmeros racionales

81

longitudminoI XX gmino Eb houle longitudminoI @xXyXxsA a distni x y C longitudminoI @yXxsA longitudminoI a H


2. Denicin por comprensin:

longitudminoP XX gmino Eb houle longitudminoP xs a sum distni p q | @pDqA `E zip @init xsA @til xsA
Evaluacin paso a paso:

longitudminoP @IDPAD@RDTAD@UDIHA a sum distni p q | @pDqA `E zip @init @IDPAD@RDTAD@UDIHAA @til @IDPAD@RDTAD@UDIHAA a sum distni p q | @pDqA `E zip @IDPAD@RDTA @RDTAD@UDIHA a sum distni p q | @pDqA `E @@IDPAD@RDTAAD@@RDTAD@UDIHAA a sum SFHDSFH a IH
Las deniciones son equivalentes:

propequivleni xs a not @null xsA aab longitudminoI xs ~a longitudminoP xs infix R ~a @~aA XX houle Eb houle Eb fool x ~a y a s@xEyA ` HFHHHI
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.45.
Solucin:

Nmeros racionales

Ejercicio 3.49. Denir el tipo ionl de los nmeros racionales como pares de enteros.

82

Captulo 3. Estructuras de datos

type ionl a @sntD sntA


Ejercicio 3.50. Denir la funcin simplifir tal que simplifir x es el nmero racional x simplicado. Por ejemplo,

simplifir simplifir simplifir simplifir


Solucin:

@IPDPRA @IPDEPRA @EIPDEPRA @EIPDPRA

; ; ; ;

@IDPA @EIDPA @IDPA @EIDPA

simplifir @nDdA a @@@signum dABnA div mD @s dA div mA where m a gd n d


Ejercicio 3.51. Denir las operaciones entre nmeros racionales qwul, qhiv, qum y qes. Por ejemplo,

qwul qhiv qum qes

@IDPA @IDPA @IDPA @IDPA

@PDQA @IDRA @QDRA @QDRA

; ; ; ;

@IDQA @PDIA @SDRA @EIDRA

Solucin:

qwul XX ionl Eb ionl Eb ionl qwul @xIDyIA @xPDyPA a simplifir @xIBxPD yIByPA qhiv XX ionl Eb ionl Eb ionl qhiv @xIDyIA @xPDyPA a simplifir @xIByPD yIBxPA qum XX ionl Eb ionl Eb ionl qum @xIDyIA @xPDyPA a simplifir @xIByPCyIBxPD yIByPA qes XX ionl Eb ionl Eb ionl qes @xIDyIA @xPDyPA a simplifir @xIByPEyIBxPD yIByPA
Ejercicio 3.52. Denir la funcin esrieionl tal que esrieionl x es la cadena correspodiente al nmero racional x. Por ejemplo,

esrieionl @IHDIPA ; 4SGT4 esrieionl @IPDIPA ; 4I4 esrieionl @qwul @IDPA @PDQAA ; 4IGQ4

3.46. Mximo comn divisor Solucin:

83

esrieionl XX ionl Eb tring esrieionl @xDyA | y9 aa I a show x9 | otherwise a show x9 CC 4G4 CC show y9 where @x9Dy9A a simplifir @xDyA

3.46.

Mximo comn divisor

Ejercicio 3.53. Redenir la funcin gd tal que gd x y es el mximo comn divisor de x e y. Por ejemplo,

gd T IS ; Q
Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

ngdI XX snt Eb snt Eb snt ngdI H H a error 4gd H H no est definido4 ngdI x y a ngdI9 @s xA @s yA where ngdI9 x H a x ngdI9 x y a ngdI9 y @x rem yA
2. Denicin con divisile y divisores

ngdP ngdP ngdP ngdP

XX snt Eb snt Eb snt H H a error 4gd H H no est definido4 H y a s y x y a lst @filter @divisile y9A @divisores x9AA where x9 a s x y9 a s y divisores x a filter @divisile xA IFFx divisile x y a x rem y aa H

Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb roperty propequivleni x y a @xDyA Ga @HDHA aab ngdI x y aa gd x y 88 ngdP x y aa gd x y

84 Comprobacin

Captulo 3. Estructuras de datos

winb quikghek propequivleni yuD pssed IHH testsF

3.47.

Bsqueda en una lista de asociacin

Ejercicio 3.54. Redenir la funcin lookup tal que lookup l z es el valor del primer elemento de la lista de bsqueda l cuya clave es z. Por ejemplo,

lookup @99DIAD@99DPAD@99DQAD@99DRA 99 ; P
Solucin:

nlookup XX iq ab Eb @DA Eb wye nlookup k a xothing nlookup k @@xDyAXxysA | kaax a tust y | otherwise a nlookup k xys
Las deniciones son equivalentes:

propequivleni XX snt Eb @sntDsntA Eb fool propequivleni z xys a nlookup z xys aa nlookup z xys
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


Se verica la siguiente propiedad

proplookup XX snt Eb snt Eb @sntDsntA Eb fool proplookup x y xys a if nlookup x xys aa tust y then elem @xDyA xys else notilem @xDyA xys
Sin embargo, no es cierta la siguiente

proplookupfls proplookupfls if elem @xDyA else nlookup

XX snt Eb snt Eb @sntDsntA Eb fool x y xys a xys then nlookup x xys aa tust y x xys aa xothing

3.48. Emparejamiento de dos listas En efecto,

85

winb quikghek proplookupfls plsifileD fter H testsX EP I @EPDEPA

3.48.

Emparejamiento de dos listas

Ejercicio 3.55. Redenir la funcin zip tal que zip x y es la lista obtenida emparejando los correspondientes elementos de x e y. Por ejemplo,

zip IDPDQ 44 ; @ID99AD@PD99AD@QD99A zip IDP 44 ; @ID99AD@PD99A


Solucin: Se presentan distintas deniciones: 1. Denicin recursiva

nzipI XX Eb Eb @DA nzipI @xXxsA @yXysA a @xDyA X zip xs ys nzipI a


2. Denicin con zipith

nzipP XX Eb Eb @DA nzipP a zipith @x y Eb @xDyAA


Las deniciones son equivalentes:

propequivleni propequivleni nzipI xs xs nzipP xs xs


Comprobacin

XX xs aa aa

snt Eb fool a zip xs xs 88 zip xs xs

winb quikghek propequivleni yuD pssed IHH testsF

86

Captulo 3. Estructuras de datos

3.49.

Emparejamiento funcional de dos listas

Ejercicio 3.56. Redenir la funcin zipith tal que zipith f x y es la lista obtenida aplicando la funcin f a los elementos correspondientes de las listas x e y. Por ejemplo,

zipith @CA IDPDQ RDSDT ; SDUDW zipith @BA IDPDQ RDSDT ; RDIHDIV
Solucin:

nzipith XX @EbEbA Eb EbEb nzipith f @xXxsA @yXysA a f x y X zipith f xs ys nzipith a


Las deniciones son equivalentes:

propequivleni XX snt Eb fool propequivleni xs a nzipith @CA xs xs aa zipith @CA xs xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

3.50.

Curricacin

Ejercicio 3.57. Una funcin est en forma cartesiana si su argumento es una tupla. Por ejemplo,

suma_cartesiana :: (Int,Int) -> Int suma_cartesiana (x,y) = x+y


En cambio, la funcin

suma_currificada :: Int -> Int -> Int suma_currificada x y = x+y


est en forma curricada. Redenir la funcin urry tal que urry f es la versin curricada de la funcin f. Por ejemplo,

urry sumrtesin P Q ; S

3.51. Funciones sobre rboles

87

y la funcin unurry tal que unurry f es la versin cartesiana de la funcin f. Por ejemplo,

unurry sumurrifid @PDQA ; S


Solucin:

nurry XX @@DA Eb A Eb @ Eb Eb A nurry f x y a f @xDyA nunurry XX @ Eb Eb A Eb @@DA Eb A nunurry f p a f @fst pA @snd pA

3.51.

Funciones sobre rboles

Ejercicio 3.58. Un rbol de tipo es una hoja de tipo o es un nodo de tipo con dos hijos que son rboles de tipo . Denir el tipo rol. Solucin:

dt rol a roj | xodo @rol A @rol A deriving how


Ejercicio 3.59. Denir el rbol correspondiente a la siguiente gura

Solucin:

88

Captulo 3. Estructuras de datos

ejrolI a xodo R @xodo P @xodo @xodo @xodo T @xodo @xodo

I Q S U

roj roj roj roj

rojA rojAA rojA rojAA

Ejercicio 3.60. Denir la funcin tmo tal que tmo es el tamao del rbol ; es decir, el nmero de nodos internos. Por ejemplo,

tmo ejrolI ; U
Solucin:

tmo XX rol Eb snt tmo roj a H tmo @xodo x I PA a I C tmo I C tmo P


Ejercicio 3.61. Un rbol de bsqueda es un rbol binario en el que que todos los valores en el subrbol izquierdo son menores que el valor en el nodo mismo, y que todos los valores en el subrbol derecho son mayores. Por ejemplo, el ejrolI es un rbol de bsqueda. Denir la funcin elemrol tal que elemrol e x se verica si e es un elemento del rbol de bqueda x. Por ejemplo,

elemrol S ejrolI ; rue elemrol W ejrolI ; plse


Solucin:

elemrol XX yrd ab Eb rol Eb elemrol e roj a plse elemrol e @xodo x izq derA | eaax a | e`x a | ebx a

fool rue elemrol e izq elemrol e der

Ejercicio 3.62. Denir la funcin insertrol tal que insertrol e inserta el elemento e en el rbol de bsqueda . Por ejemplo,

winb insertrol xodo R @xodo P @xodo @xodo @xodo T @xodo

V ejrolI I roj rojA Q roj rojAA S roj rojA

3.51. Funciones sobre rboles

89

@xodo U roj @xodo V roj rojAAA winb insertrol Q ejrolI xodo R @xodo P @xodo I roj rojA @xodo Q @xodo Q roj rojA rojAA @xodo T @xodo S roj rojA @xodo U roj rojAA
Solucin:

insertrol insertrol insertrol | e `a x | e b x

XX yrd ab Eb rol Eb rol e roj a xodo e roj roj e @xodo x izq derA a xodo x @insertrol e izqA der a xodo x izq @insertrol e derA

Ejercicio 3.63. Denir la funcin listrol tal que listrol l es el rbol de bsqueda obtenido a partir de la lista l. Por ejemplo,

winb listrol QDPDRDI xodo I roj @xodo R @xodo P roj @xodo Q roj rojAA rojA
Solucin:

listrol XX yrd ab Eb rol listrol a foldr insertrol roj


Ejercicio 3.64. Denir la funcin pln tal que pln es la lista obtenida aplanando el rbol . Por ejemplo,

pln ejrolI ; IDPDQDRDSDTDU pln @listrol QDPDRDIA ; IDPDQDR

90 Solucin:

Captulo 3. Estructuras de datos

pln XX rol Eb pln roj a pln @xodo x izq derA a pln izq CC x CC pln der
Ejercicio 3.65. Denir la funcin ordendporrol tal que ordendporrol l es la lista l ordenada mediante rbol de bsqueda. Por ejemplo,

ordendporrol IDRDQDUDP ; IDPDQDRDU


Solucin:

ordendporrol XX yrd ab Eb ordendporrol a pln F listrol


Se verica la siguiente propiedad

propordendporrol XX snt Eb fool propordendporrol xs a listordend @ordendporrol xsA


En efecto,

winb quikghek propordendporrol yuD pssed IHH testsF

3.52.

Bsqueda en lista ordenada

Ejercicio 3.66. Denir la funcin elemord tal que elemord e l se verica si e es un elemento de la lista ordenada l. Por ejemplo,

elemord Q IDQDS ; rue elemord P IDQDS ; plse


Solucin:

elemord XX yrd ab Eb Eb fool elemord a plse elemord e @xXxsA | x ` e a elemord e xs | x aa e a rue | otherwise a plse

3.53. Movimiento segn las direcciones

91

3.53.

Movimiento segn las direcciones

Ejercicio 3.67. Denir el tipo nito hireim tal que sus constructores son Norte, Sur, Este y Oeste. Solucin:

dt hirein a xorte | ur | iste | yeste


Ejercicio 3.68. Denir la funcin mueve tal que mueve d p es el punto obtenido moviendo el punto p una unidad en la direccin d. Por ejemplo,

mueve ur @mueve iste @RDUAA ; @SDTA


Solucin:

mueve mueve mueve mueve mueve

XX hirein Eb @sntDsntA Eb @sntDsntA xorte @xDyA a @xDyCIA ur @xDyA a @xDyEIA iste @xDyA a @xCIDyA yeste @xDyA a @xEIDyA

3.54.

Los racionales como tipo abstracto de datos

Ejercicio 3.69. Denir el tipo de datos tio para representar los racionales como un par de enteros (su numerador y denominador). Solucin:

dt tio a

snt snt

Ejercicio 3.70. Denir tio como una instancia de how de manera que la funcin show muestra la forma simplicada obtenida mediante la funcin simplifirtio tal que simplifirtio x es el nmero racional x simplicado. Por ejemplo,

simplifirtio simplifirtio simplifirtio simplifirtio


Solucin:

@ IP @ IP @ EIP @ EIP

PRA EPRA EPRA PRA

; IGP ; EIGP ; IGP ; EIGP

92

Captulo 3. Estructuras de datos

instne how tio where show @ x IA a show x show @ x yA a show x9 CC 4G4 CC show y9 where @ x9 y9A a simplifirtio @ x yA simplifirtio XX tio Eb tio simplifirtio @ n dA a @@@signum dABnA div mA @@s dA div mA where m a gd n d
Ejercicio 3.71. Denir los nmeros racionales 0, 1, 2, 3, 1/2, 1/3 y 1/4. Por ejemplo,

winb Xset Ct winb rhos P XX tio winb rerio IGQ XX tio


Solucin:

rgero rno rhos rres rwedio rerio rgurto

a a a a a a a

H I P Q I I I

I I I I P Q R

Ejercicio 3.72. Denir las operaciones entre nmeros racionales rwul, rhiv, rum y res. Por ejemplo,

rwul rhiv rum res

@ @ @ @

I I I I

PA PA PA PA

@ @ @ @

P I Q Q

QA RA RA RA

; IGQ ; P ; SGR ; EIGR

Solucin:

rwul XX tio Eb tio Eb tio rwul @ A @ dA a simplifirtio @ @BA @BdAA rhiv XX tio Eb tio Eb tio rhiv @ A @ dA a simplifirtio @ @BdA @BAA

3.54. Los racionales como tipo abstracto de datos

93

rum XX tio Eb tio Eb tio rum @ A @ dA a simplifirtio @ @BdCBA @BdAA res XX tio Eb tio Eb tio res @ A @ dA a simplifirtio @ @BdEBA @BdAA

94

Captulo 3. Estructuras de datos

Captulo 4 Aplicaciones de programacin funcional


Contenido
4.1. Segmentos iniciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.2. Segmentos nales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4.3. Segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4.4. Sublistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4.5. Comprobacin de subconjunto . . . . . . . . . . . . . . . . . . . . . . . . 97 4.6. Comprobacin de la igualdad de conjuntos . . . . . . . . . . . . . . . . 98 4.7. Permutaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 4.8. Combinaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 4.9. El problema de las reinas . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.10. Nmeros de Hamming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

4.1.

Segmentos iniciales

Ejercicio 4.1. Denir la funcin iniiles tal que iniiles l es la lista de los segmentos iniciales de la lista l. Por ejemplo,

iniiles PDQDR ; DPDPDQDPDQDR iniiles IDPDQDR ; DIDIDPDIDPDQDIDPDQDR


Solucin:

iniiles XX Eb iniiles a iniiles @xXxsA a X xXys | ys `E iniiles xs


95

96

Captulo 4. Aplicaciones de programacin funcional

El nmero de los segmentos iniciales es el nmero de los elementos de la lista ms uno.

propiniiles XX snt Eb fool propiniiles xs a length@iniiles xsA aa I C length xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

4.2.

Segmentos nales

Ejercicio 4.2. Denir la funcin finles tal que finles l es la lista de los segmentos nales de la lista l. Por ejemplo,

finles PDQDR ; PDQDRDQDRDRD finles IDPDQDR ; IDPDQDRDPDQDRDQDRDRD


Solucin:

finles XX Eb finles a finles @xXxsA a @xXxsA X finles xs


El nmero de los segmentos nales es el nmero de los elementos de la lista ms uno.

propfinles XX snt Eb fool propfinles xs a length@finles xsA aa I C length xs


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

4.3. Segmentos

97

4.3.

Segmentos

Ejercicio 4.3. Denir la funcin segmentos tal que segmentos l es la lista de los segmentos de la lista l. Por ejemplo,

winb segmentos PDQDR DRDQDQDRDPDPDQDPDQDR winb segmentos IDPDQDR DRDQDQDRDPDPDQDPDQDRDIDIDPDIDPDQDIDPDQDR


Solucin:

segmentos XX Eb segmentos a segmentos @xXxsA a segmentos xs CC xXys | ys `E iniiles xs

4.4.

Sublistas

Ejercicio 4.4. Denir la funcin sulists tal que sulists l es la lista de las sublistas de la lista l. Por ejemplo,

winb sulists PDQDR PDQDRDPDQDPDRDPDQDRDQDRD winb sulists IDPDQDR IDPDQDRDIDPDQDIDPDRDIDPDIDQDRDIDQDIDRDID PDQDRD PDQD PDRD PD QDRD QD RD
Solucin:

sulists XX Eb sulists a sulists @xXxsA a xXys | ys `E su CC su where su a sulists xs

4.5.

Comprobacin de subconjunto

Ejercicio 4.5. Denir la funcin suonjunto tal que suonjunto xs ys se verica si xs es un subconjunto de ys. Por ejemplo,

suonjunto IDQDPDQ IDPDQ ; rue suonjunto IDQDRDQ IDPDQ ; plse

98

Captulo 4. Aplicaciones de programacin funcional

Solucin: Se presentan distintas deniciones: 1. Denicin recursiva:

suonjuntoI XX iq ab Eb Eb fool suonjuntoI a rue suonjuntoI @xXxsA ys a elem x ys 88 suonjuntoI xs ys


2. Denicin mediante ll:

suonjuntoP XX iq ab Eb Eb fool suonjuntoP xs ys a ll @elem ysA xs


3. Usaremos como suonjunto la primera

suonjunto XX iq ab Eb Eb fool suonjunto a suonjuntoI


Las deniciones son equivalentes:

propequivleni XX snt Eb snt Eb fool propequivleni xs ys a suonjuntoI xs ys aa suonjuntoP xs ys


Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF

4.6.

Comprobacin de la igualdad de conjuntos

Ejercicio 4.6. Denir la funcin igulonjunto tal que igulonjunto lI lP se verica si las listas lI y lP vistas como conjuntos son iguales Por ejemplo,

igulonjunto IFFIH IHDWFFI ; rue igulonjunto IFFIH IIDIHFFI ; plse


Solucin: Se presentan distintas deniciones: 1. Usando suonjunto

igulonjuntoI XX iq ab Eb Eb fool igulonjuntoI xs ys a suonjunto xs ys 88 suonjunto ys xs

4.7. Permutaciones 2. Por recursin.

99

igulonjuntoP XX iq ab Eb Eb fool igulonjuntoP xs ys a ux @nu xsA @nu ysA where ux a rue ux @xXA a plse ux @yXA a plse ux @xXxsA ys a x elem ys 88 ux xs @delete x ysA
3. Usando sort

igulonjuntoQ XX @iq D yrd A ab Eb Eb fool igulonjuntoQ xs ys a sort @nu xsA aa sort @nu ysA
4. Usaremos como igulonjunto la primera

igulonjunto XX iq ab Eb Eb fool igulonjunto a igulonjuntoI


Las deniciones son equivalentes:

propequivleni XX propequivleni xs igulonjuntoP igulonjuntoQ


Comprobacin

snt Eb snt Eb fool ys a xs ys aa igulonjuntoI xs ys 88 xs ys aa igulonjuntoI xs ys

winb quikghek propequivleni yuD pssed IHH testsF

4.7.

Permutaciones

Ejercicio 4.7. Denir la funcin permutiones tal que permutiones l es la lista de las permutaciones de la lista l. Por ejemplo,

winb permutiones PDQ PDQDQDP winb permutiones IDPDQ IDPDQDIDQDPDPDIDQDPDQDIDQDIDPDQDPDI


Solucin: Se presentan distintas deniciones:

100 1. Por eleccin y recursin:

Captulo 4. Aplicaciones de programacin funcional

import htFvist @@AA permutionesI XX iq ab Eb permutionesI a permutionesI xs a Xp | `E xsD p `E permutionesI@xs A


2. Por recursin e intercalacin:

permutionesP XX Eb permutionesP a permutionesP @xXxsA a zs | ys `E permutionesP xsD zs `E interl x ys


donde interl x ys es la lista de las listas obtenidas intercalando x entre los elementos de la lista l. Por ejemplo,

interl I PDQ ; IDPDQDPDIDQDPDQDI interl XX Eb Eb interl e a e interl e @xXxsA a @eXxXxsA X @xXysA | ys `E @interl e xsA
Las deniciones son equivalentes:

propequivleni XX snt Eb roperty propequivleni xs a length xs `a T aab igulonjunto @permutionesI xsA @permutionesP xsA
Comprobacin

winb quikghek propequivleni yuD pssed IHH testsF


El nmero de permutaciones de un conjunto de n elementos es el factorial de n.

propnmeropermutiones XX snt Eb roperty propnmeropermutiones xs a length xs `a T aab length @permutionesP xsA aa ftoril @length xsA where ftoril n a produt IFFn

4.8. Combinaciones

101

En la propiedades hemos acotado la longitude mxima de las listas generadas para facilitar los clculos. La segunda denicin es ms eciente: n permutionesI permutionesP 2 140 102 3 334 172 4 1.170 428 5 5.656 1.740 6 34.192 10.036 7 243.744 71.252 donde las columnas segunda y tercera contiene el nmero de reducciones.

4.8.

Combinaciones

Ejercicio 4.8. Denir la funcin ominiones tal que ominiones n l es la lista de las combinaciones narias de la lista l. Por ejemplo,

ominiones P IDPDQDR ; IDPDIDQDIDRDPDQDPDRDQDR


Solucin: Se presentan distintas deniciones: 1. Denicin mediante sulists:

ominionesI XX snt Eb Eb ominionesI n xs a ys | ys `E sulists xsD length ys aa n


2. Denicin directa:

ominionesP ominionesP ominionesP ominionesP

XX snt Eb Eb H a a @nCIA @xXxsA a xXys | ys `E ominionesP n xs CC ominionesP @nCIA xs

La segunda denicin es ms eciente como se comprueba en la siguiente sesin

winb Xset Cs winb length @ominionesI P IFFISA IHS @IWIUWTR redutionsD PQPUWVQ ellsD Q grge olletionsA winb length @ominionesP P IFFISA IHS @TPIU redutionsD WIQP ellsA

102

Captulo 4. Aplicaciones de programacin funcional

4.9.

El problema de las reinas

Ejercicio 4.9. El problema de las N reinas consiste en colocar N reinas en un tablero rectangular de dimensiones N por N de forma que no se encuentren ms de una en la misma lnea: horizontal, vertical o diagonal. Denir la funcin reins tal que reins n es la lista de las soluciones del problema de las N reinas. Por ejemplo,

reins R ; QDIDRDPDPDRDIDQ
La primera solucin QDIDRDP se interpreta como R R R R Solucin: Se importa la diferencia de conjuntos @A del mdulo vist:

import htFvist @@AA


El tablero se representa por una lista de nmeros que indican las las donde se han colocado las reinas. Por ejemplo, QDS indica que se han colocado las reinas @IDQA y @PDSA.

type lero a snt


La denicin de reins es

reins XX snt Eb lero reins n a reinseux n where reinseux H a reinseux @mCIA a rXrs | rs `E reinseux mD r `E @IFFn rsAD noet r rs I
donde noet r rs d se verica si la reina r no ataca a niguna de las de la lista rs donde la primera de la lista est a una distancia horizontal d.

noet XX snt Eb lero Eb snt Eb fool noet a rue noet r @XrsA distr a s@rEA Ga distr 88 noet r rs @distrCIA

4.10. Nmeros de Hamming

103

4.10.

Nmeros de Hamming

Ejercicio 4.10. Los nmeros de Hamming forman una sucesin estrictamente creciente de nmeros que cumplen las siguientes condiciones: 1. El nmero 1 est en la sucesin. 2. Si x est en la sucesin, entonces 2 x, 3 x y 5 x tambin estn. 3. Ningn otro nmero est en la sucesin. Denir la funcin hmming tal que hmming es la sucesin de Hamming. Por ejemplo,

tke IS hmming ; IDPDQDRDSDTDVDWDIHDIPDISDITDIVDPHDPR


Solucin:

hmming XX snt hmming a I X mezlQ PBi | i `E hmming QBi | i `E hmming SBi | i `E hmming
donde mezlQ xs ys zs es la lista obtenida mezclando las listas ordenadas xs, ys y zs y eliminando los elementos duplicados. Por ejemplo,

mezlQ PDRDTDVDIH QDTDWDIP SDIH ; PDQDRDSDTDVDWDIHDIP mezlQ XX snt Eb snt Eb snt Eb snt mezlQ xs ys zs a mezlP xs @mezlP ys zsA
y mezlP xs ys zs es la lista obtenida mezclando las listas ordenadas xs e ys y eliminando los elementos duplicados. Por ejemplo,

mezlP PDRDTDVDIHDIP QDTDWDIP ; PDQDRDTDVDWDIHDIP mezlP XX snt Eb snt Eb snt mezlP pd@xXxsA qd@yXysA | x ` y | x b y | otherwise mezlP ys mezlP xs a a a a a xXmezlP xs q yXmezlP p ys xXmezlP xs ys ys xs

104

Captulo 4. Aplicaciones de programacin funcional

Bibliografa
[1] H. C. Cunningham. Notes on functional programming with haskell. Technical report, University of Mississippi, 2007. [2] J. Fokker. Programacin funcional. Technical report, Universidad de Utrech, 1996. [3] B. C. Ruiz, F. Gutirrez, P. Guerrero, and J. Gallardo. Razonando con Haskell (Un curso sobre programacin funcional). Thompson, 2004. [4] S. Thompson. Haskell: The Craft of Functional Programming. AddisonWesley, second edition, 1999. En Bib. [5] E. P. Wentworth. Introduction to Funcional Programming. Technical report, Parallel Processing Group. Rhodes University, 1994.

105

ndice alfabtico
gmino, 80 hirein, 91 unto, 80 ionl, 81 tio, 91 888, 15 rol, 87 a, 20 nteriorI, 15 nteriorP, 15 pln, 90 roosenoI, 39 roosenoP, 40 rosenoI, 39 rosenoP, 40 rterhehgito, 65 ominionesI, 101 ominionesP, 101 om, 9 ompuest, 34 ontI, 44 ontP, 44 ontQ, 44 on, 43 udrdoI, 11 udrdoP, 11 udrdoQ, 11 d, 36 dgitohegrter, 64 deinteroegdenI, 68 deinteroegdenP, 69 derivdfurd, 38 derivdpinheleno, 38 derivdpin, 38 derivduper, 38 derivd, 38 desdeI, 65 desdeP, 65 distnilorigen, 80 distni, 80 divisile, 34 divisoresI, 35 divisoresP, 35 divisores, 35 doleI, 21 doleP, 21 doleQ, 21 dosilevdoeI, 24 dosilevdoeP, 24 dosilevdoeQ, 24 ejrolI, 87 elemrol, 88 elemord, 90 esositivoI, 24 esositivoP, 25 esositivoQ, 25 esrieionl, 83 ftI, 8 ftP, 8 ftQ, 8 ftR, 8 ftS, 8 ftT, 8 ftorilesI, 31 ftorilesP, 32 ftorilesQ, 32
106

ndice alfabtico

107

ftorilesR, 32 ftorilesS, 32 ftoril, 9 fiI, 77 fiP, 78 fiQ, 78 finles, 96 flip, 34 igulvist, 43 igulonjuntoI, 57, 98 igulonjuntoP, 57, 99 igulonjuntoQ, 57, 99 imprI, 10 imprP, 10 imprQ, 10 imprR, 10 inminI, 79 iniiles, 95 insertrol, 89 insert, 58 invers, 40 inversoI, 23 inversoP, 23 inversoQ, 23 listrol, 89 listordendI, 56 listordendP, 56 listordend, 56 longitudminoI, 80 longitudminoP, 81 mezlI, 63 mezlP, 63 mezl, 63 mitdI, 22 mitdP, 22 mitdQ, 22 mueve, 91 nsI, 13 nsP, 14 nndI, 28

nndP, 28 nurry, 87 ndrophile, 50 ndrop, 49 nelemI, 53 nelemP, 53 nelemQ, 53 nelemR, 53 nelemS, 54 nelemT, 54 nfilterI, 26 nfilterP, 26 nfoldl, 30 nfoldr, 30 nfstQ, 76 nfst, 74 ngdI, 83 ngdP, 83 nhed, 45 nid, 17 ninitI, 47 ninitP, 47 ninitQ, 47 niterte, 68 nlstI, 45 nlstP, 46 nlstQ, 46 nlstR, 46 nlstS, 46 nlengthI, 52 nlengthP, 52 nlengthQ, 52 nlengthR, 52 nlookup, 84 nmpI, 25 nmpP, 25 nminimumI, 61 nminimumP, 61 nminimumQ, 61 nnotilemI, 55

108

ndice alfabtico

nnotilemP, 55 nnotilemQ, 55 nnotilemR, 55 nnotilemS, 55 nnotilemT, 55 nnotilemU, 54, 55 norI, 29 norP, 29 nprodutoI, 27 nprodutoP, 28 nrepetI, 66 nrepetP, 66 nrepetQ, 66 nrepliteI, 67 nrepliteP, 67 nrepliteQ, 67 nreverseI, 51 nreverseP, 51 nreverseQ, 51 nsnr, 31 nsignum, 14 nsndQ, 76 nsnd, 75 nsplitet, 77 nsumI, 27 nsumP, 27 ntil, 45 ntke, 48 nthdQ, 76 nunurry, 87 nuntil, 33 nzipith, 86 nzipI, 85 nzipP, 85 nth, 50 orden, 74 ordenporinserinI, 60 ordenporinserinP, 60 ordenporinserinQ, 60 ordenporm, 64

ordendporrol, 90 permutionesI, 100 permutionesP, 100 posiinI, 73 posiinP, 73 poteniI, 16 poteniP, 16 primosI, 36 primosporriI, 69 primosporriP, 70 primo, 35 puntogero, 39 qhiv, 82 qwul, 82 qes, 82 qum, 82 rgero, 92 rgurto, 92 rhiv, 92 rhos, 92 rwedio, 92 rwul, 92 res, 92 rum, 92 rerio, 92 rres, 92 rno, 92 rziI, 39 rziP, 40 rzudrdI, 39 rzudrdP, 40 riesI, 13 riesP, 13 rizgudrd, 39 reins, 102 segmentos, 97 siguienteI, 20 siguienteP, 20 simplifirtio, 91 simplifir, 82

ndice alfabtico

109

suonjuntoI, 98 suonjuntoP, 98 sulists, 97 sumdeudrdosI, 12 sumdeudrdosP, 12 sumdeudrdosQ, 12 sumdeudrdosR, 12 tmo, 88 todossmpresI, 71 todossmpresP, 72 todossmpresQ, 72 todosresI, 71 todosresP, 71 todosresQ, 71 tringulo, 72 vrile, 77

También podría gustarte