lunes, 7 de noviembre de 2016

SUMA DE DOS NÚMEROS SIN SUMARLOS 

JAVA VS HASKELL


Resolver el siguiente algoritmo lógico.
Supongamos que tenemos n1 (que es el primer numero dado) y n2(segundo numero dado) y tenemos que sumarlos pero sin hacer la operación principal de suma con el operador "+" ¿De que manera lo resolverías?
Es claro, al hacer :
-Primer caso: 5 + 2 = 7
-Segundo caso: -5 + 2 = -3
-Tercer caso: 5 + -2 = 3
-Cuarto caso: -5 + -2 = -7

Tenemos que tener en cuenta primordial mente la inserción de los signos de n1 y n2 pues no sabemos si se insertara un -5 o un 5 ya que esto se tiene que evaluar a la hora de implementar en la solución.
A continuación se presenta el código de solución al algoritmo en JAVA.

---------------------------------------------------------------------------------
package sumasinsumar;
import javax.swing.JOptionPane;
//@author Junior
public class SumaSinSumar {
public static void main(String []args){
float n1=0, n2=0, r=0;{
n1=Float.parseFloat(JOptionPane.showInputDialog("Dame n1"));
n2=Float.parseFloat(JOptionPane.showInputDialog("Dame n2"));
/*Se evalúa el primer caso si los dos números son positivos*/
if(n1>0 && n2>0){
/*Se aplica la operación:*/
r=(-n1-n2)*-1;
}/*Se evalúa el segundo caso si el primer numero es negativo y el segundo es positivo*/
else if(n1<0 && n2>0){
r=(n1)-(-(n2));
}/*Se evalúa el tercer caso si el primer numero es positivo y el segundo es negativo*/
else if(n1>0 && n2<0){
r=((-(n1))-(n2))*-1;
}/*Se evalúa el ultimo y cuarto caso si los dos números son negativos*/else if(n1<0 && n2<0)
r=n1-(n2*-1);
}        
System.out.println("El resultado de tu suma sin sumar es:\n"+r);
}}

---------------------------------------------------------------------------------



--------------------------------------------------------------------------------
Ahora comparamos el código de solución al algoritmo resuelto en Haskell.
Nos damos cuenta que al declarar la función "sumasinsumar" utilizamos guardas " | " las cuales nos permitirán evaluar los cuatro casos de solución ya mencionados anteriormente:  

sumasinsumar n1 n2|(n1>0 && n2>0)=(-n1-n2)*(-1)
                                 |(n1<0 && n2>0)=(n1)-(-(n2))
                                 |(n1>0 && n2<0)=((-(n1))-(n2))*(-1)
                                 |(n1<0 && n2<0)=n1-(n2*(-1))

---------------------------------------------------------------------------------
---------------------------------------------------------------------------------

COMPARACIÓN JAVA VS HASKELL

1.- Reducción. Como podemos apreciar como primera comparación es el tamaño del código, en Java son aproximadamente 19 lineas de código mientras que en Haskell solo son 4.

2.- Tipo de dato. En Java nosotros declaramos el tipo de dato y al parecer eso tiene una ventaja pues tenemos mayor control sobre las variables declaradas, pero que pasaría si se declara como entero y al introducir un dato se introduce como punto flotante, pues aquí abría un error que que abortaría el programa, a diferencia que es Haskell nosotros no declaramos el tipo de dato y quizás tenemos menos controlo sobre lo que tenemos de entrada y de salida pero por la inferencia que tiene la función al ser implementada esta se ejecuta y toma el tipo de dato que infiere.

3.- Complejidad. Si Haskell solo son 4 lineas de código pero es obvio que tiene mayor complejidad ya que la manera de resolver el algoritmo es mediante una función la cual nos permita resolver pero es de mayor complejidad a la hora de ser implementada pues lo hace de manera implícita a comparación de Java ya que al hacerlo de manera explicita podemos darnos cuenta paso a paso y con menos dificultad lo que vamos haciendo y los IDE nos ayudan a encontrar errores de sintaxis con mayor facilidad a comparacion de Haskell.




No hay comentarios.:

Publicar un comentario