Lógica - Ayuda con programa

 
Vista:
sin imagen de perfil
Val: 1
Ha mantenido su posición en Lógica (en relación al último mes)
Gráfica de Lógica

Ayuda con programa

Publicado por Carlos (1 intervención) el 26/09/2017 01:09:25
Alguien me podría explicar este programa linea por linea, soy nuevo programando en haskell y no
entiendo mucho su lógica. Su función es convertir numero enteros a romanos,
pero no se como hace para convertirlos.


1
2
3
4
5
6
7
8
9
10
11
valores = [(10,"X"), (9,"IX"), (5,"V"), (4,"IV"), (1,"I")]
 
numRomano :: Integer -> String
numRomano 0 = "N"
numRomano x = numRomano1 x
 
numRomano1 :: Integer -> String
numRomano1 x
  | x == 0 = ""
  | x > 0 = b ++ numRomano1 (x - a)
      where (a, b) = head $ filter ((<= x) . fst) valores

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Conversión de números enteros a romanos

Publicado por Alejandro (49 intervenciones) el 26/01/2024 23:48:15
Carlos, el programa que has proporcionado es un programa en Haskell que convierte números enteros a números romanos. Aquí está la explicación línea por línea:

1. valores = [(10,"X"), (9,"IX"), (5,"V"), (4,"IV"), (1,"I")]
- Se define una lista llamada "valores" que contiene tuplas de pares. Cada tupla consiste en un número entero y su equivalente en números romanos.

2. numRomano :: Integer -> String
- Se define una función llamada "numRomano" que toma un número entero como argumento y devuelve una cadena de caracteres (String).

3. numRomano 0 = "N"
- Si el número entero pasado a la función es 0, entonces devuelve la cadena "N", que podría representar "Nulo" o "Cero" en este contexto.

4. numRomano x = numRomano1 x
- Para cualquier otro valor de x, llama a la función "numRomano1" con el mismo valor x.

5. numRomano1 :: Integer -> String
- Se define otra función llamada "numRomano1" que toma un número entero como argumento y devuelve una cadena de caracteres (String).

6. numRomano1 x | x == 0 = ""
- Si el número entero pasado a la función es 0, entonces devuelve una cadena vacía, indicando que el número romano equivalente es nulo.

7. | x > 0 = b ++ numRomano1 (x - a)
- Si el número entero pasado es mayor que 0, se utiliza la descomposición de patrones (pattern matching) para asignar los valores de a y b utilizando la función "head" y "filter" en la lista "valores". Luego, concatena la cadena b con la llamada recursiva de la función "numRomano1" con el nuevo valor (x - a).

8. where (a, b) = head $ filter ((<= x) . fst) valores
- La cláusula "where" se utiliza para definir localmente la variable (a, b). Se usa la función "head" y "filter" para encontrar la primera tupla en "valores" cuyo primer elemento (número) sea menor o igual a x. Luego, se descompone esa tupla en (a, b).

En resumen, el programa utiliza la técnica de recursión y descomposición de patrones para convertir un número entero en su equivalente en números romanos, utilizando la lista "valores" como referencia para las conversiones específicas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar