Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente. Algoritmo de división
Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente.
Sin embargo, no necesitamos que estas funciones sean primitivas, sino
que... ¡podemos programarlas nosotros mismos! Algoritmo de división
Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente.
Sin embargo, no necesitamos que estas funciones sean primitivas, sino
que... ¡podemos programarlas nosotros mismos!
Esto corresponde a programar algún algoritmo de división ...
Algoritmo de división
Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente.
Sin embargo, no necesitamos que estas funciones sean primitivas, sino
que... ¡podemos programarlas nosotros mismos!
Esto corresponde a programar algún algoritmo de división ... ¿Alguna
idea? Algoritmo de división
Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente.
Sin embargo, no necesitamos que estas funciones sean primitivas, sino
que... ¡podemos programarlas nosotros mismos!
Esto corresponde a programar algún algoritmo de división ... ¿Alguna
idea?
Idea: Para calcular div n m podemos usar la fórmula recursiva:
0 si n < m div n m = 1 + div (n-m) m si n ≥ m Algoritmo de división
Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente.
Sin embargo, no necesitamos que estas funciones sean primitivas, sino
que... ¡podemos programarlas nosotros mismos!
Esto corresponde a programar algún algoritmo de división ... ¿Alguna
idea?
Idea: Para calcular div n m podemos usar la fórmula recursiva:
0 si n < m div n m = 1 + div (n-m) m si n ≥ m
¿Cómo serı́a el código Haskell?
Algoritmo de división
Para obtener el cociente y resto entre dos números enteros, tenemos
las funciones div y mod, respectivamente.
Sin embargo, no necesitamos que estas funciones sean primitivas, sino
que... ¡podemos programarlas nosotros mismos!
Esto corresponde a programar algún algoritmo de división ... ¿Alguna
idea?
Idea: Para calcular div n m podemos usar la fórmula recursiva:
0 si n < m div n m = 1 + div (n-m) m si n ≥ m
¿Cómo serı́a el código Haskell? ¿Cómo calculamos el resto?
Algoritmo de Euclides
El Algoritmo de Euclides calcula el máximo común divisor entre dos
números a, b ∈ Z+ . Algoritmo de Euclides
El Algoritmo de Euclides calcula el máximo común divisor entre dos
números a, b ∈ Z+ . Recordemos el algoritmo en su versión imperativa: 1 r0 := a; 2 r1 := b; 3 Mientras ri 6= 0, hacer: 4 ri+1 := ri−1 mod ri ; 5 i := i + 1; 6 Fin 7 El resultado es ri−1 ; Algoritmo de Euclides
¿Cómo serı́a en Haskell?
Algoritmo de Euclides
¿Cómo serı́a en Haskell?
mcd :: Int -> Int -> Int
Algoritmo de Euclides
¿Cómo serı́a en Haskell?
mcd :: Int -> Int -> Int
mcd a 0 = a Algoritmo de Euclides
¿Cómo serı́a en Haskell?
mcd :: Int -> Int -> Int
mcd a 0 = a mcd a b = mcd b (mod a b) Algoritmo de Euclides
¿Cómo serı́a en Haskell?
mcd :: Int -> Int -> Int
mcd a 0 = a mcd a b = mcd b (mod a b)
El peor caso del algoritmo se obtiene cuando a y b son dos números
consecutivos de la sucesión de Fibonacci (Lamé, 1795–1870). Algoritmo de Euclides
¿Cómo serı́a en Haskell?
mcd :: Int -> Int -> Int
mcd a 0 = a mcd a b = mcd b (mod a b)
El peor caso del algoritmo se obtiene cuando a y b son dos números
consecutivos de la sucesión de Fibonacci (Lamé, 1795–1870).
En general, el número de divisiones que realiza el algoritmo nunca
supera 5 veces el número de dı́gitos de a y b, con lo cual la cantidad de llamadas recursivas está acotada por 5 log10 (a). Cambio de base en Haskell
Problema: Dados a, b ∈ Z+ con b > 1, escribir el número a en base
b. Cambio de base en Haskell
Problema: Dados a, b ∈ Z+ con b > 1, escribir el número a en base
b. Por ejemplo ... 1 Si a = 10 y b = 2, entonces la respuesta es 10102 . 2 Si a = 17 y b = 3, entonces la respuesta es 1223 . 3 Si a = 145 y b = 10, entonces la respuesta es 14510 . Cambio de base en Haskell
Problema: Dados a, b ∈ Z+ con b > 1, escribir el número a en base
b. Por ejemplo ... 1 Si a = 10 y b = 2, entonces la respuesta es 10102 . 2 Si a = 17 y b = 3, entonces la respuesta es 1223 . 3 Si a = 145 y b = 10, entonces la respuesta es 14510 .
¿Cómo lo harı́amos en Haskell si representamos la salida como una
lista de enteros? Cambio de base en Haskell
Problema: Dados a, b ∈ Z+ con b > 1, escribir el número a en base
b. Por ejemplo ... 1 Si a = 10 y b = 2, entonces la respuesta es 10102 . 2 Si a = 17 y b = 3, entonces la respuesta es 1223 . 3 Si a = 145 y b = 10, entonces la respuesta es 14510 .
¿Cómo lo harı́amos en Haskell si representamos la salida como una
lista de enteros?
¿Cómo cambiamos el programa si queremos representar la salida como
una cadena de caracteres? Cambio de base en Haskell
Problema: Dados a, b ∈ Z+ con b > 1, escribir el número a en base
b. Por ejemplo ... 1 Si a = 10 y b = 2, entonces la respuesta es 10102 . 2 Si a = 17 y b = 3, entonces la respuesta es 1223 . 3 Si a = 145 y b = 10, entonces la respuesta es 14510 .
¿Cómo lo harı́amos en Haskell si representamos la salida como una
lista de enteros?
¿Cómo cambiamos el programa si queremos representar la salida como
una cadena de caracteres? ¿Qué problema tiene esta representación si luego queremos usar el resultado para cálculos posteriores? Ejercicios
1 Consideremos la sucesión t1 , t2 , . . . , tal que tn es la cantidad de
llamadas recursivas del Algoritmo de Euclides cuando se ejecuta con a = Fn y b = Fn−1 (donde Fn representa el n-ésimo número de Fibonacci). Escribir un programa que tome como parámetro un entero n y que retorne tn . 2 Graficar la sucesión t1 , t2 , . . . definida en el ejercicio anterior. 3 Escribir un programa que tome un entero b > 1 y un entero a representado en base b (expresado como una lista de enteros) y que retorne un Int con el entero a. 4 Escribir un programa que tome un entero b > 1 y un entero a representado en base b (expresado como una lista de enteros) y que retorne una lista de enteros con el entero representado en base 10.