Saltar la navegación

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

Creado con eXeLearning (Ventana nueva)