Programación funcional – Decisiones y recursión
(define (esPar numero)
(if (= (remainder numero 2) 0)
"El número es par"
"El número es impar"))
(remainder x 2)
: Calcula el residuo de dividir x por 2.
(= (remainder x 2) 0)
: Compara si el resultado de remainder x 2 es igual a 0. Esta expresión devolverá #t (verdadero) si el residuo es 0 y #f (falso) si no lo es
(esPar 12)
Output: "El número es par"
(esPar 7)
Output: "El número es impar"
Definir una función que acepta un número y devuelve verdadero si dicho número es divisible por seis
(define (divisiblePorSeis numero)
(= (remainder numero 6) 0))
(divisiblePorSeis 13)
Output:#f
(divisiblePorSeis 12)
Output:#t
Definir una función que reciba dos números y devuelva el mayor de ambos
(define (mayor x y)
(if (> x y) x y)
)
(mayor 10 5)
Output: 10
Definir una función que reciba dos números y devuelva verdadero si el segundo es múltiplo del primero
(define (multiplo x y)
(= (remainder x y) 0)
)
(remainder x y)
devuelve el valor del resto que queda después de dividir x por y.
Definir una función que reciba dos números y devuelva verdadero si alguno de ellos es múltiplo del otro
(define (multiplo x y)
(or (= (remainder x y) 0)
(= (remainder y x) 0)
)
)
(multiplo 5 10)
Output: #t
(multiplo 10 5)
Output: #t
(multiplo 10 3)
Output: #f
(multiplo 3 10)
Output: #f
Definir una función que reciba tres números y devuelva verdadero si los tres números son iguales
(define (iguales x y z)
(and
(= x y)
(= x z)
(= z y)
)
)
(iguales 10 10 10)
Output: #t
(iguales 101 10 10)
Output: #f
Definir una función que acepta tres números y devuelva verdadero si dos de ellos sin iguales
(define (iguales x y z)
(or
(= x y)
(= x z)
(= z y)
)
)
(iguales 10 11 11)
Output: #t
(iguales 11 12 13)
Output: #f
En una fábrica, la eficiencia de una máquina se calcula en función de las piezas producidas, por una parte, y de las piezas defectuosas por la otra Las condiciones son las siguientes:
(define (puntaje piezasProducidas piezasDefectuosas)
(cond
[(and(> piezasProducidas 1000)(< piezasDefectuosas 20)) "Puntaje 4."]
[(> piezasProducidas 1000) "Puntaje 3."]
[(< piezasDefectuosas 20) "Puntaje 2."]
[else "Puntaje 1."]
)
)
(puntaje 1000 20)
Output: "Puntaje 1."
(puntaje 1000 19)
Output: "Puntaje 2."
(puntaje 1001 20)
Output: "Puntaje 3."
(puntaje 1001 19)
Output: "Puntaje 4."
Escribir una función que acepte un elemento y una lista, y devuelva verdadero si el elemento pertenece a la lista.
(define
(pertenece elemento lista)
(if (null? lista)
#f
(if (= (car lista) elemento )
#t
(pertenece elemento (cdr lista))
)
)
)
(null? lista)
: Verifica si la lista está vacía.
(car lista)
: Devuelve el primer elemento de la lista.
(cdr lista)
: Devuelve la lista sin el primer elemento, es decir, el resto de la lista.
(= (car lista) elemento)
: Compara el primer elemento de la lista con el elemento que estamos buscando.
(pertenece 7 '(5 4 7))
Output: #t
(pertenece 3 '(5 4 7))
Output: #f
El símbolo '
(apóstrofe) antes de un paréntesis en ‘(5 4 7) se usa en Racket (y otros lenguajes de la familia Lisp) para crear una lista literal. Esto significa que estás indicando al intérprete que no debe evaluar el contenido de la lista, sino que debe considerarlo como una lista literal de elementos.
Primera llamada:
Segunda llamada:
Tercera llamada:
Cuarta llamada:
(define (sumarLista lista)
(if (null? lista)
0
(+ (car lista)
(sumarLista (cdr lista))
)
)
)
(sumarLista '(-23 12 23))
(define (verificarLista lista)
(if (null? lista)
"Vacia"
"con elementos"
)
)
(verificarLista '(1))
Output: "con elementos"
(verificarLista '(a))
Output: "con elementos"
(verificarLista '())
Output: "Vacia"
Escribir una función que acepte una lista y devuelva la cantidad de elementos de esa lista.
(define (cantidad lista contador)
(if (null? lista)
(display contador)
(cantidad (cdr lista) (+ contador 1))
)
)
(cantidad '(1 2 3 4 5 6 8 9) 0)
Output: 8
Alternativa (Length):
(define (cantidad lista) (length lista))
Escribir una función que acepte una lista numérica y devuelva la sumatoria de la misma.
(define (sumar lista)
(apply + lista)
)
(define (sumatoria lista suma)
(if (null? lista)
(display suma)
(sumatoria
(cdr lista)(+ suma (car lista))
)
)
)
(sumatoria '(-1000 233 1500 ) 0)
Output: 733
Escribir una función que acepte una lista de números enteros y devuelva la cantidad de números naturales que contiene la lista.
(define (es-natural n)
(and (integer? n) (>= n 0))
)
(define (contar-naturales lista)
(if (null? lista)
0
(+(if (es-natural (car lista) ) 1 0)
(contar-naturales (cdr lista) )
)
)
)
(contar-naturales '(1 -2 3 4.5 5)) ; Devuelve 3
(contar-naturales '(0 -1 2)) ; Devuelve 2
(contar-naturales '(-3 -5 -7)) ; Devuelve 0
(contar-naturales '(3.14 "texto" 2)) ; Devuelve 1
(contar-naturales '()) ; Devuelve 0
Alternativa utilizando cond
(define (es-natural n)
(and (integer? n) (>= n 0))
)
(define (contar-naturales lista)
(cond
[(null? lista) 0]
[(es-natural (car lista))
(+ 1 (contar-naturales (cdr lista)))
]
[else (contar-naturales (cdr lista))]
)
)
(contar-naturales '(1 -2 3 4.5 5)) ; Devuelve 3
(contar-naturales '(0 -1 2)) ; Devuelve 2
(contar-naturales '(-3 -5 -7)) ; Devuelve 0
(contar-naturales '(3.14 "texto" 2)) ; Devuelve 1
(contar-naturales '()) ; Devuelve 0
Escribir una función “esta-entre”, que acepta dos números enteros “m” y “n”, y devuelve la lista de los enteros mayores o iguales que “m” y menores o iguales que “n”.
(define (esta-entre m n)
(if (> m n)
'()
(cons m (esta-entre(+ m 1) n) )
)
)
(esta-entre 1 10)
Output: '(1 2 3 4 5 6 7 8 9 10)
(esta-entre 1 1)
Output: '(1)
(esta-entre 5 0)
Output: '()
Definir una función que acepta una lista devuelve el último elemento de ésta.
(define (ultimo lista)
(if (null? lista)
'()
(if (null? (cdr lista) )
(car lista)
(ultimo (cdr lista) )
)
)
)
Caso Base: Se verifica si la lista está vacía utilizando (null? lista)
. Si es así, devuelve la lista vacía.
Segundo Caso Base: Se verifica si el resto de la lista es vacío (null? (cdr lista))
. Si esto es cierto, significa que el primer elemento es el único elemento de la lista, por lo que se devuelve con (car lista)
.
Recursión: Si la lista tiene más de un elemento, se llama a ultimo recursivamente con el resto de la lista (cdr lista)
.
(ultimo '(1 2 3 4 5)) ; Devuelve 5
(ultimo '(a b c d)) ; Devuelve d
(ultimo '(42)) ; Devuelve 42
Definir una función que acepte dos listas y devuelva una lista que sea la concatenación de éstas.
(define (concatenar lista1 lista2)
(if (null? lista1)
lista2
(cons (car lista1) (concatenar (cdr lista1) lista2))
)
)
(concatenar '(1 2 3 4 ) '(a b c d ))
Output: '(1 2 3 4 a b c d)
Definir una función que acepta una lista y dos átomos “a” y “b”, y devuelve otra lista con los elementos de la primera, pero con el átomo “a” sustituido por el “b”, en su primera ocurrencia.
(define (sustituir-primera lista a b)
(if (null? lista)
'()
(if (equal? (car lista) a) ; Si el primer elemento es igual a a
(cons b (cdr lista)) ; Sustituye por b y devuelve el resto de la lista.
(cons (car lista) (sustituir-primera (cdr lista) a b)) ; Mantiene el elemento y llama recursivamente.
)
)
)
(sustituir-primera '(1 2 3 a 4 a) 'a 'b) ; Devuelve '(1 2 3 b 4 a)
(sustituir-primera '(a b c d) 'a 'x) ; Devuelve '(x b c d)
(sustituir-primera '(1 2 3) 'a 'b) ; Devuelve '(1 2 3)
(sustituir-primera '() 'a 'b) ; Devuelve '()
✍️ Autor: Emilio Giordano
🔗 Más resúmenes de Programación Declarativa en el repositorio