0.d.1 - Pensamiento Computacional - Algorítmica

Objetivo

Comprender el concepto de "algoritmo" como una secuencia ordenada, finita y precisa de pasos para resolver un problema, y desarrollar la capacidad de diseñar, representar y analizar algoritmos básicos.

1. Contenidos

1.1 ¿Qué es un algoritmo?

Un algoritmo es una secuencia ordenada, finita y sin ambigüedades de pasos que permite resolver un problema específico o realizar una tarea. Es la materialización de la solución de un problema tras aplicar descomposición y abstracción.

Características clave de un algoritmo:

  • Preciso: Cada paso debe estar claramente definido, sin interpretaciones ambiguas.
  • Ordenado: Los pasos deben ejecutarse en una secuencia lógica determinada.
  • Finito: Debe tener un número limitado de pasos y llegar a un final.
  • Determinista: Dadas las mismas entradas, siempre produce las mismas salidas.
  • Efectivo: Cada paso debe ser realizable (teórica o prácticamente).

Ejemplo práctico 1: Algoritmo para hacer café

Problema: Preparar una taza de café con cafetera de goteo.

Algoritmo:

  1. Llenar el depósito con agua hasta el nivel indicado.
  2. Colocar un filtro de papel en el portafiltros.
  3. Añadir dos cucharadas de café molido al filtro.
  4. Cerrar el portafiltros y colocarlo en la cafetera.
  5. Colocar la jarra vacía en la placa caliente.
  6. Encender la cafetera pulsando el botón de inicio.
  7. Esperar a que finalice el proceso (3-5 minutos).
  8. Apagar la cafetera y servir el café.

Ejemplo práctico 2: Algoritmo de búsqueda de número en lista

Problema: Encontrar si un número específico está en una lista desordenada.

Algoritmo (búsqueda lineal):

  1. Tomar el primer elemento de la lista.
  2. Si el elemento es igual al número buscado, terminar y devolver "encontrado".
  3. Si no, pasar al siguiente elemento de la lista.
  4. Repetir los pasos 2 y 3 hasta llegar al final de la lista.
  5. Si se termina la lista sin encontrar el número, devolver "no encontrado".

Ejemplo práctico 3: Algoritmo para ordenar tres números

Problema: Dados tres números (a, b, c), mostrarlos en orden ascendente.

Algoritmo:

  1. Si a > b, intercambiar a y b.
  2. Si b > c, intercambiar b y c.
  3. Si a > b, intercambiar a y b.
  4. Mostrar a, b, c.

Los algoritmos son la base de la programación informática, pero también están presentes en recetas de cocina, instrucciones de montaje, protocolos médicos, procedimientos administrativos y muchas actividades cotidianas.

1.2 Formas de representar algoritmos

Existen diferentes notaciones para representar algoritmos, cada una con ventajas según el contexto.

a) Lenguaje natural

Descripción en texto con palabras y frases (como los ejemplos anteriores).

  • Ventaja: Fácil de entender para personas sin formación técnica.
  • Desventaja: Puede ser ambiguo y poco preciso.

b) Pseudocódigo

Notación híbrida entre lenguaje natural y código de programación, sin rigores sintácticos.

Algoritmo: Calcular media de tres notas
Inicio
    Escribir "Introduce nota1:"
    Leer nota1
    Escribir "Introduce nota2:"
    Leer nota2
    Escribir "Introduce nota3:"
    Leer nota3
    media = (nota1 + nota2 + nota3) / 3
    Escribir "La media es:", media
Fin

c) Diagramas de flujo

Representación gráfica usando símbolos estandarizados y flechas que indican el flujo de ejecución.

Simbología básica:

  • Óvalo: Inicio / Fin
  • Rectángulo: Proceso / Acción
  • Rombo: Decisión / Condición
  • Paralelogramo: Entrada / Salida
  • Flechas: Flujo de control

d) Código de programación

Implementación real en un lenguaje específico (Python, Java, C++, etc.).

def calcular_media(notas):
    suma = sum(notas)
    media = suma / len(notas)
    return media

1.3 Estructuras de control algorítmicas

Todo algoritmo se construye combinando tres estructuras básicas:

a) Secuencia

Ejecución de pasos en orden lineal, uno tras otro.

Paso 1 → Paso 2 → Paso 3 → ... → Paso N
  • Ejemplo: Sacar el DNI, enseñarlo al vigilante, entrar al edificio.

b) Selección (condicionales)

Decisión entre dos o más caminos según el cumplimiento de una condición.

SI condición ENTONCES
    acción_verdadero
SINO
    acción_falso
FIN SI
  • Ejemplo: Si llueve → coger paraguas; Si no → no coger paraguas.

c) Iteración (bucles o ciclos)

Repetición de un bloque de instrucciones un número determinado de veces o mientras se cumpla una condición.

MIENTRAS condición SEA CIERTA
    hacer_acción
FIN MIENTRAS
  • Ejemplo: Mientras queden platos sucios → lavar un plato.

Tabla resumen de estructuras:

Estructura Palabra clave Control de flujo Ejemplo cotidiano
SecuenciaOrdenLinealSeguir receta paso a paso
SelecciónSI-SINOBifurcaciónSi hay atasco, otra ruta
IteraciónMIENTRAS / PARACíclicoHacer ejercicio 10 veces

1.4 Propiedades de un buen algoritmo

Corrección

El algoritmo debe producir la salida correcta para todas las entradas válidas.

Eficiencia temporal

El tiempo de ejecución debe ser razonable. Se mide en función del tamaño de la entrada.

Eficiencia espacial (memoria)

La cantidad de recursos de memoria debe ser adecuada.

Legibilidad

Debe ser comprensible para otras personas (y para uno mismo al revisarlo después).

Modularidad

Preferiblemente dividido en submódulos o subalgoritmos independientes.

Regla de oro: Antes de escribir código, diseña el algoritmo. Un algoritmo claro y correcto se puede implementar en cualquier lenguaje. La programación es la traducción de un algoritmo a un lenguaje concreto.

2. Ejercicios

Ejercicio 1: Diseño de algoritmo cotidiano (selección + iteración)

Algoritmo para gestionar las tareas domésticas de una semana.

Enunciado:

Una persona debe organizar las tareas del hogar para toda la semana (lunes a domingo). Las tareas posibles son: hacer la compra, limpiar el baño, limpiar la cocina, pasar la aspiradora, regar las plantas, sacar la basura y lavar la ropa. No todas las tareas se hacen todos los días. Existen reglas:

  • La compra se hace solo los lunes o jueves.
  • El baño se limpia lunes, miércoles y viernes.
  • La cocina se limpia todos los días.
  • La aspiradora se pasa lunes, miércoles y viernes.
  • Las plantas se riegan lunes y jueves.
  • La basura se saca martes, jueves y sábado.
  • La ropa se lava martes y viernes.

Tarea:

  1. Diseñar un algoritmo en pseudocódigo que recorra los 7 días de la semana y, para cada día, determine qué tareas deben realizarse.
  2. Utilizar al menos una estructura de selección (SI) y una de iteración (PARA o MIENTRAS).
  3. Como salida, debe mostrar para cada día la lista de tareas a realizar.

Pseudocódigo a completar:

Algoritmo: TareasDomésticasSemana
Inicio
    // Crear lista de días
    dias = ["lunes", "martes", "miércoles", "jueves", "viernes", "sábado", "domingo"]
    
    // Para cada día de la semana
    PARA cada día EN dias HACER
        tareas_del_dia = []  // lista vacía para acumular tareas
        
        // Comprobar tareas según las reglas
        SI (día == "lunes" O día == "jueves") ENTONCES
            añadir "hacer compra" a tareas_del_dia
        FIN SI
        
        // [Añadir aquí el resto de condiciones para cada tarea]
        
        // Mostrar resultado
        ESCRIBIR "El " + día + " hay que hacer: " + tareas_del_dia
    FIN PARA
Fin

Preguntas de reflexión:

  • ¿Qué ocurre si añadimos la condición de que las plantas también se riegan los sábados? ¿Cuántos cambios requiere el algoritmo?
  • ¿Cómo modificarías el algoritmo para que, si hay más de 3 tareas el mismo día, avise de que el día está "cargado"?
  • ¿Qué estructura de control añadirías para contar el total de tareas semanales?

Ejercicio 2: Comparación de algoritmos por eficiencia

Búsqueda en una guía telefónica.

Enunciado:

Tienes una guía telefónica de una ciudad con N = 1.000.000 de habitantes ordenados alfabéticamente. Quieres encontrar el número de teléfono de una persona específica ("María García").

Existen dos algoritmos posibles: la búsqueda lineal (página por página desde el principio) y la búsqueda binaria (abrir por la mitad y decidir si ir a la mitad izquierda o derecha).

Tarea:

  1. Describir paso a paso el algoritmo de búsqueda binaria sobre la guía telefónica (en lenguaje natural o pseudocódigo).
  2. Calcular en el peor de los casos: ¿cuántas páginas hay que consultar con búsqueda lineal? ¿Y con búsqueda binaria? (Ayuda: en búsqueda binaria, el número máximo de pasos es log₂(N) redondeado al alza).
  3. Contestar las preguntas de reflexión.

Esquema para búsqueda binaria:

Algoritmo: BúsquedaBinariaEnGuía
Entrada: guía_telefónica (lista ordenada de 1 a 1.000.000), nombre_buscado
Salida: número de teléfono o "no encontrado"

Inicio
    izquierda = 1
    derecha = 1.000.000
    
    MIENTRAS izquierda <= derecha HACER
        medio = (izquierda + derecha) / 2  (división entera)
        
        SI guía[medio] == nombre_buscado ENTONCES
            DEVOLVER teléfono_en_medio
        SINO SI nombre_buscado < guía[medio] ENTONCES
            // Buscar en la mitad izquierda
            derecha = medio - 1
        SINO
            // Buscar en la mitad derecha
            izquierda = medio + 1
        FIN SI
    FIN MIENTRAS
    
    DEVOLVER "no encontrado"
Fin

Cálculos de eficiencia (completar):

  • Búsqueda lineal (peor caso): consultar hasta ______ páginas.
  • Búsqueda binaria (peor caso): consultar aproximadamente ______ páginas (log₂ 1.000.000 ≈ 20).

Preguntas de reflexión:

  • ¿Qué requisito debe cumplir la guía telefónica para poder aplicar búsqueda binaria?
  • ¿Para qué tamaño de guía compensa cambiar de búsqueda lineal a búsqueda binaria?
  • Si N = 10, ¿es la búsqueda binaria claramente superior? ¿Por qué?
  • ¿En qué situaciones cotidianas usas implícitamente una búsqueda binaria?

Reto

Diseña un algoritmo para preparar una maleta de viaje de manera óptima (maximizar utilidad de objetos con limitación de peso). Debes incluir al menos una decisión condicional (SI) y una iteración (MIENTRAS o PARA). Representa el algoritmo en pseudocódigo y en diagrama de flujo (textual).

Bibliografía