3.1 Características de los tipos de subprogramas: Funciones y Procedimientos
Subprogramas y Recursividad en Python
En programación, los subprogramas son bloques de código que realizan una tarea específica y pueden ser invocados desde otras partes del programa. Estos se dividen en dos categorías principales: funciones y procedimientos. En Python, no existe una distinción formal entre funciones y procedimientos, ya que ambos se implementan utilizando la palabra clave def. Sin embargo, conceptualmente:
- Funciones: Subprogramas que devuelven un valor.
- Procedimientos: Subprogramas que no devuelven un valor (realizan una acción)
Además, la recursividad es una técnica en la que una función se llama a sí misma para resolver un problema. A continuación, se desarrolla este tema con ejemplos y ejercicios.
1. Funciones en Python
Una función es un subprograma que toma unos datos de entrada (parámetros), realiza una tarea y devuelve un resultado. En Python, las funciones se definen utilizando la palabra clave def.
Sintaxis de una Función
def nombre_funcion(parametro1, parametro2, ...):
# Bloque de código
return valor # Devuelve un valor
- def: Palabra clave para definir una función.
- nombre_funcion: Identificador de la función.
- parametro1, parametro2, ...: Parámetros de entrada (opcionales).
- return: Devuelve un valor (opcional).
Ejemplo: Función para sumar dos números.
def sumar(a, b):
return a + b
resultado = sumar(5, 3)
print("La suma es:", resultado) # Salida: La suma es: 8
2. Características de los Subprogramas
Reutilización de Código:
Los subprogramas permiten encapsular código que se utiliza repetidamente, evitando la duplicación.
Modularidad:
Facilitan la organización del código en módulos independientes y fáciles de mantener.
Abstracción:
Ocultan los detalles de implementación, permitiendo al programador centrarse en la lógica de alto nivel.
Parámetros y Argumentos:
Los parámetros son variables definidas en la función, mientras que los argumentos son los valores pasados al llamar la función.
Ámbito de Variables:
Las variables definidas dentro de un subprograma tienen un ámbito local y no son accesibles fuera de él.
Recursividad
La recursividad es una técnica en la que una función se llama a sí misma para resolver un problema. Es útil para problemas que pueden dividirse en subproblemas más pequeños del mismo tipo.
Sintaxis:
def funcion_recursiva(parametros):
if condicion_parada: # Caso base
return valor
else:
return funcion_recursiva(nuevos_parametros) # Llamada recursiva
Caso Base: Condición que detiene la recursión.
Llamada Recursiva: La función se llama a sí misma con nuevos parámetros.
Ejemplo:
def factorial(n):
if n == 0: # Caso base
return 1
else:
return n * factorial(n - 1) # Llamada recursiva
# Llamada a la función
print(factorial(5)) # Salida: 120
Ejemplos y Ejercicios Comentados
Ejemplo 1: Función para Calcular el Máximo Común Divisor (MCD)
def mcd(a, b):
"""
Calcula el máximo común divisor de dos números usando el algoritmo de Euclides.
"""
while b != 0:
a, b = b, a % b
return a
# Llamada a la función
print(mcd(48, 18)) # Salida: 6
Ejemplo 2: Procedimiento para Imprimir una Lista
def imprimir_lista(lista):
"""
Imprime cada elemento de una lista.
"""
for elemento in lista:
print(elemento)
# Llamada al procedimiento
imprimir_lista([1, 2, 3, 4, 5])
Ejemplo 3: Función Recursiva para la Serie de Fibonacci
def fibonacci(n):
"""
Calcula el n-ésimo número de la serie de Fibonacci.
"""
if n <= 1: # Caso base
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2) # Llamada recursiva
# Llamada a la función
print(fibonacci(6)) # Salida: 8
Ejercicio 1: Función para Calcular el Promedio
def promedio(lista):
"""
Calcula el promedio de una lista de números.
"""
return sum(lista) / len(lista)
# Llamada a la función
print(promedio([10, 20, 30, 40, 50])) # Salida: 30.0
Ejercicio 2: Procedimiento para Ordenar una Lista
def ordenar_lista(lista):
"""
Ordena una lista de números en orden ascendente.
"""
lista.sort()
print("Lista ordenada:", lista)
# Llamada al procedimiento
ordenar_lista([34, 12, 56, 7, 23]) # Salida: Lista ordenada: [7, 12, 23, 34, 56]
Ejercicio 3: Función Recursiva para la Suma de Dígitos
def suma_digitos(n):
"""
Calcula la suma de los dígitos de un número de forma recursiva.
"""
if n < 10: # Caso base
return n
else:
return n % 10 + suma_digitos(n // 10) # Llamada recursiva
# Llamada a la función
print(suma_digitos(1234)) # Salida: 10
Consideraciones sobre la Recursividad
Ventajas
Simplifica la solución de problemas complejos.
Código más legible y elegante.
Desventajas
Puede consumir mucha memoria si no se maneja correctamente.
Riesgo de desbordamiento de pila (stack overflow) si no hay un caso base bien definido.
Optimización
En Python, se puede usar la técnica de memoización para almacenar resultados intermedios y evitar cálculos repetidos.
Ejemplo de Memoización
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
# Llamada a la función
print(fibonacci(50)) # Salida: 12586269025
Obra publicada con Licencia Creative Commons Reconocimiento Compartir igual 4.0