Tema

Práctica 3, ejercicio 2

7 respuestas 6817 visitas

No los hice pensando en postearlos, así que puede ser que se me haya piantado alguna que otra cosa. Si ven algo mal avisen. En algunas definí otras funciones auxiliares para usar en el ejercicio, y tal vez en alguna también di por sobreentendido algunas funciones fáciles (onda divisores(n)). En fin, una porquería jaja.

Ejercicios 1, 2 y 3:
1)
aux suc(x : Int) : Int = x+1

aux suma(x,y : Float) : Float = x+y

aux producto(x,y : Float) : Float = x*y

Ejercicios 4, 5, 6 y 7:
4)
aux cuadrado(x : Int) : Bool = en(exp(x,0.5),Int)

aux primo(x : Int) : Bool = long( [ i | i ← (1..x], x mod i == 0] ) == 1

aux coprimos(x,y : Int) Bool =
long( [i, i ← [1..y], i mod y == 0, i mod x == 0] ) == 1

aux divisoresGrandes (x,y : Int) : Bool =
todos( [ dx>y | dx ← [ i | i ← (1..x), i mod x == 0] )

Ejercicio 8
8)
aux divisoresPrimos(x : Int) : [Int] = [p | p ← (1..x), p mod x == 0, primo(p)]

aux mayorPrimo (x : Int) : Int =
acum( beta(i>=j)*i + beta(i<j)*j | i : Int = cabeza(divisoresPrimos(x)), j ← divisoresPrimos(x) )

Ejercicio 9
aux multiplosComunes (x,y : Int) : [Int] =
[ d | d ← [x..x*y], d mod x == 0 , d mod y == 0]

aux mcm (x,y : Int) : Int =
indice( [d | d ← multiplosComunes(x,y), todos([d>=i | i ← multiplosComunes(x,y)]),0)

Ejercicio 10
aux divisores(i : Int) [Int] = [d | d ← (1..i), d mod i == 0]

aux divisoresComunes(x,y : Int) : [Int] =
[ d | d ← divisores(x), en(d,divisores(y))]

aux mcd(x,y : Int) : Int = indice(divisoresComunes(x,y),longitud(divisoresComunes(x,y))-1)

Editado 1 vez.

en el 7) me parece q deberias incluir a x entre los divisores,porq x divide a x y nadie dijo q lo excluyésemos,no?

en el 8) creo q p mod x == 0, primo(p) eso deberia estar de esta forma: primo(p),x mod p == 0 (los cambie de lugar y puse x donde estaba p)

Firma

Pape Trataremos de buscarle una solución más útil que el famoso "reinicie el equipo y vea si mejora"

no entiendo por q escribiste el 5) aux primo(x : Int) : Bool = long( [ i | i ← (1..x], x mod i == 0] ) == 1
el ejercicio pide q si x es primo q sea verdadero...pero no entiendo por q usastes el "long" y ==> (x mod i == 0) tampoco lo entiendo no seria mas bien algo asi... ( x mod 2==1)==1
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa no entiendo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
saludos!

Lo que hace su lista por comprensión es poner en la secuencia a los números entre 2 y x que dividen a x.. Fijate que si x es primo, entonces esa secuencia va a tener un solo elemento que va a ser x, sino va a tener más.. Además si le pasas al 0 ó al 1 como argumento, te da falso porque te queda que a i lo sacás de una lista vacía (fijate que [2 .. 0] y [2 .. 1] son vacío).. O sea, que está perfecta la función.. yo lo hice con una idea similar, pero con un no existe o con un para todo, no me acuerdo, pero es lo mismo..

sep .entiendo lo q hace...lo q no me keda claro todabia es lo del long...pero bue preguntare en practica gracias!

long(a:[T]) : Int = |a:[T]| q es la longitud de la lista, lo que hace él ahí es asegurarse que la lista de divisores tiene sólo 1 elemento a partir de 1 para decir que es primo (en el caso que sea primo, sería el primo el elemento de la lista). Es decir, si long( [lista q puso] ) == 1, entonces es un primo, si tiene más, no.

No sé si aclaré realmente XD

Firma

"If debugging is the process of removing bugs, then programming must be the process of putting them in." -- Dijkstra

revisa el ejercicio 6 q esta mal creo.... probe con 4 y 3 y no da..

lo q hice yo fue poner:
(no(existe a<--Int), x mod a == 0 && y mod a ==0;

mi duda es si es q se puede poner ese "Int" ahi o no...

sino tmb esta laopcion:
(no(existe a<--(1...x+y)), x mod a == 0 && y mod a ==0; (by carla 😉 )

vale el int??

Firma

111dz1.gif

yo en el 8 hice esto, sin acum:

aux divPrimos(x:Z):[Z]= [ i | (1..x], x mod i ==0, primo( i)] ;

aux mayorPrimo(x:Z):Z= cab([ divPrimos( x)_{|divPrimos( x)|-1-i} | i <- [0.. |divPrimos( x)|), divPrimos( x)i < divPrimos( x){i+1}] )