UTNianos

Versión completa: [Ayuda] Consulta Ejercicio Funcional
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, estoy tratando de resolver este ejercicio de la guia y no me sale de ninguna manera, alguien me podria decir como se hace?

Gracias

1.12: "Implementar la función esCuadradoPerfecto/1, sin
hacer operaciones con punto flotante.
Ayuda: les va a venir bien una función auxiliar, tal vez de dos parámetros.
Pensar que el
primer cuadrado perfecto es 0, para llegar al 2do (1) sumo 1, para llegar
al 3ro (4) sumo
3, para llegar al siguiente (9) sumo 5, después sumo 7, 9, 11 etc..
También algo de recursividad van a tener que usar.
preguntaron lo mismo en el grupo y Alf respondió:
Cita:También tené en cuenta que en muchos cursos todavía no pasó la primera
clase, por lo que puede ser que necesites que te expliquen mejor conceptos
como recursividad, y guárdas ó pattern matching, dependiendo de cómo lo
quieras resolver. Sin embargo, con lo que sabés ya debería bastar.

Por otro lado, para pensar esa función, te conviene dar éstos pasos
anteriores:
9801 es un cuadrado perfecto. ¿Cuál es su cuadrado perfecto siguiente? (no
vale usar las funciones que ya te da Haskell) ¿Podés generalizar ésto en
una función que te calcule el cuadrado siguiente de cualquier cuadrado dado?
Importante: ¿Podés responder esa pregunta sin otro dato más que el 9801?
Probablemente necesites también otra cosa.

Eso es un puntapié inicial.

Saludos!

Alf

Como justamente yo estoy dentro de quienes no pasamos de la primer clase (Lunes a la noche, anual), no me preocupé =P

Hasta el ejercicio anterior a ese salieron todos de 10 =) (tardé unos minutos en entender que los nombres de las funciones que creo NO pueden empezar en mayúsculas... blush )
Maggie89, con lo que pude leer en los apuntes, hice esto:

Spoiler: Mostrar
esCuadradoPerfecto nro
| nro==0 = 1
| nro<0 = 0
| nro>0 = sumaCuadrados nro 1
sumaCuadrados nro1 nro2
|cuadrado nro2 < nro1 = sumaCuadrados nro1 (nro2+1)
|cuadrado nro2== nro1 = 1
|cuadrado nro2 > nro1 = 0
cuadrado nro=nro*nro

le doy número (como pide el enunciado) y me responde "1" si es cuadrado perfecto o "0" si no lo es.

No creo que sea 100% lo que están buscando (algo me dice que esperan que responda con un booleano true/false), pero que saca si un número es la raiz de un entero, sin hacer ningún cálculo con decimales, lo saca =)

Slds!
Teniendo en cuenta que un numero es cuadrado perfecto si su raiz cuadrada devuelve un entero, yo lo resolveria de la siguiente forma y sin demasiadas complicaciones:


esCuadradoPerfecto::Integer->Bool
esCuadradoPerfecto x = sqrt x == y && esEntero y



Ahora, me resta desarrollar esEntero ...y desconozco si exite alguna funcion predefinida en el prelude que me lo resuelva pero tiene que haberla, no? Confused
el tema es que yo entendí el "sin hacer operaciones de punto flotante" como que me prohibía usar el "sqrt".

BTW:
esEntero x = x == fromInteger (round x)

Pero sigo sin parecerme que esté permitido el sqrt por el enunciado.

EDIT: logré que me responda con booleanos =)
Spoiler: Mostrar
esCuadradoPerfecto nro
| nro==0 = nro==0
| nro<0 = nro==0
| otherwise = esIgualCuadrado nro 1
esIgualCuadrado nro1 nro2
|cuadrado nro2 < nro1 = esIgualCuadrado nro1 (nro2+1)
|cuadrado nro2 == nro1 = (cuadrado nro2) == nro1
|cuadrado nro2 > nro1 = (cuadrado nro2) == nro1
cuadrado nro=nro*nro

Slds!
Yo lo hice de una manera diferente, no le di mucha bola a la pista del ejercicio porque solo me confundia, lo que hice fue usar esto

\[n \] es cuadrado perfecto \[\Leftrightarrow \]\[n = \sum_{k = 1}^{\sqrt{n}} (2k -1)\]

Por lo tanto para determinar si un numero es cuadrado perfecto voy sumando numeros impares mientras la sumatoria sea menor a \[n\], si llega el caso en que la sumatoria es igual a \[n\] entonces \[n\] es cuadrado perfecto, si es mayor entonces no lo es. Dejo el codigo:


sumarImpares n i j | (n == 0) || (n < i) = 0
| (n == i) = n
| n > i = sumarImpares n (i+j) (j+2)
esCuadradoPerfecto n = (sumarImpares n 0 1) == n


en i voy guardando el resultado de la sumatoria, mientras que en j guardo el numero impar proximo a sumar.

Y no, no habia que usar sqrt, porque si n no es cuadrado perfecto estarias haciendo una operacion con punto flotante
qué boludo, no se me ocurrió lo de guardarlo. Es buena la de la suma.

Otra forma, más pulida de la primer opción es:
esCuadradoPerfecto nro = esIgualCuadrado nro 1
esIgualCuadrado nro raiz = raiz^2 == nro || esIgualCuadrado nro (raiz+1)

que usa pattern matchin

Slds!
Hola, Que tal? Soy nueva y no puedo crear un tema,pido disculpas por hacer mi consulta aca.
Alguien puede pasarme algún apunte que explique con ejemplos composicion- aplicación parcial y orden superior ? Muchas gracias!
te fijaste en los apuntes de pdp.com.ar?

Composición

Orden Superior

Aplicación Parcial

o en la Wiki:
Composición
Orden Superior
Aplicación Parcial

;) Ojalá te sirva!


Off-topic:
BTW, para crear un nuevo tema, desde el foro en el que quieras preguntar, la barra de arriba de los threads tiene: Número de página del foro; Buscar en este foro; Nuevo Tema. thumbup3


Slds!
URLs de referencia