64. Funciones en algoritmos y programación

Las funciones matemáticas ayudan a transformar datos, tomar decisiones, medir costos y construir algoritmos reutilizables.

64.1 Introducción

En programación, una función puede ser una pieza de código, pero también puede representar una relación matemática. Ambas ideas se conectan cuando usamos una regla para transformar entradas en salidas.

Los algoritmos usan funciones para calcular resultados, clasificar datos, normalizar valores, estimar costos y componer procesos complejos a partir de pasos simples.

64.2 Función como transformación

Una función transforma un valor de entrada en un valor de salida. Ese patrón aparece en casi cualquier algoritmo.

entrada → transformación → salida
function doble(x) {
  return x * 2;
}

console.log(doble(5));
console.log(doble(12));

64.3 Transformar listas de datos

Cuando se aplica una función a cada elemento de una lista, se obtiene una nueva lista transformada.

const valores = [1, 2, 3, 4];

function cuadrado(x) {
  return x * x;
}

const transformados = valores.map(cuadrado);

console.log(transformados);

64.4 Funciones para normalizar

Normalizar significa llevar valores a una escala común. Esto es útil para gráficos, porcentajes, estadísticas e interfaces.

function normalizar(valor, minimo, maximo) {
  return (valor - minimo) / (maximo - minimo);
}

console.log(normalizar(50, 0, 100));
console.log(normalizar(75, 50, 100));

64.5 Funciones para limitar valores

Muchos algoritmos necesitan impedir que un valor salga de cierto rango.

function limitar(valor, minimo, maximo) {
  return Math.max(minimo, Math.min(maximo, valor));
}

console.log(limitar(120, 0, 100));
console.log(limitar(-10, 0, 100));
console.log(limitar(45, 0, 100));

64.6 Funciones de decisión

Una función también puede decidir una categoría o estado según una condición matemática.

function clasificarTemperatura(valor) {
  if (valor < 10) return "frío";
  if (valor < 25) return "templado";
  return "calor";
}

console.log(clasificarTemperatura(5));
console.log(clasificarTemperatura(18));
console.log(clasificarTemperatura(30));

64.7 Funciones de costo

En algoritmos, una función de costo mide qué tan caro o conveniente es un resultado.

menor costo → mejor opción
function costo(distancia, tiempo) {
  return distancia * 2 + tiempo * 5;
}

console.log(costo(10, 3));
console.log(costo(5, 8));

64.8 Elegir la mejor opción

Si podemos calcular el costo de varias alternativas, un algoritmo puede elegir la mejor.

function costo(opcion) {
  return opcion.distancia * 2 + opcion.tiempo * 5;
}

function mejorOpcion(opciones) {
  let mejor = opciones[0];

  for (const opcion of opciones) {
    if (costo(opcion) < costo(mejor)) {
      mejor = opcion;
    }
  }

  return mejor;
}

const opciones = [
  { nombre: "A", distancia: 10, tiempo: 3 },
  { nombre: "B", distancia: 5, tiempo: 8 },
  { nombre: "C", distancia: 8, tiempo: 4 }
];

console.log(mejorOpcion(opciones));

64.9 Funciones de puntuación

Una función de puntuación combina varios criterios en un solo valor para ordenar o comparar resultados.

function puntaje(producto) {
  return producto.calidad * 0.7 - producto.precio * 0.3;
}

const productos = [
  { nombre: "A", calidad: 90, precio: 50 },
  { nombre: "B", calidad: 70, precio: 20 }
];

console.log(productos.map(function(producto) {
  return { nombre: producto.nombre, puntaje: puntaje(producto) };
}));

64.10 Ordenar usando una función

Los algoritmos de ordenamiento suelen usar una función de comparación.

const valores = [8, 3, 10, 1, 5];

valores.sort(function(a, b) {
  return a - b;
});

console.log(valores);

La función de comparación define el criterio del algoritmo.

64.11 Funciones para interpolar

Interpolar permite calcular valores intermedios entre dos extremos.

function interpolar(inicio, fin, t) {
  return inicio + (fin - inicio) * t;
}

console.log(interpolar(0, 100, 0));
console.log(interpolar(0, 100, 0.5));
console.log(interpolar(0, 100, 1));

64.12 Funciones de suavizado

Un algoritmo puede usar una función para suavizar transiciones y evitar cambios bruscos.

function suavizar(t) {
  return t * t * (3 - 2 * t);
}

console.log(suavizar(0));
console.log(suavizar(0.25));
console.log(suavizar(0.5));
console.log(suavizar(1));

64.13 Componer funciones en un algoritmo

Un algoritmo puede construirse encadenando funciones pequeñas.

function limpiar(texto) {
  return texto.trim();
}

function minusculas(texto) {
  return texto.toLowerCase();
}

function slug(texto) {
  return texto.replaceAll(" ", "-");
}

const resultado = slug(minusculas(limpiar("  Curso de Funciones  ")));

console.log(resultado);

64.14 Funciones puras

Una función pura devuelve siempre el mismo resultado para la misma entrada y no modifica datos externos.

function suma(a, b) {
  return a + b;
}

console.log(suma(2, 3));
console.log(suma(2, 3));

Este tipo de función facilita pruebas, composición y razonamiento sobre algoritmos.

64.15 Funciones con efectos secundarios

Una función tiene efectos secundarios si modifica algo fuera de sí misma, como una variable externa o la pantalla.

let contador = 0;

function incrementar() {
  contador++;
  return contador;
}

console.log(incrementar());
console.log(incrementar());

No son incorrectas, pero deben usarse con cuidado porque hacen más difícil predecir el comportamiento.

64.16 Funciones de complejidad

El rendimiento de un algoritmo puede modelarse con funciones que dependen del tamaño de entrada.

Función Tipo de crecimiento Ejemplo conceptual
f(n) = n Lineal Recorrer una lista
f(n) = n² Cuadrático Comparar todos contra todos
f(n) = log(n) Logarítmico Búsqueda binaria

64.17 Comparar costos

Una tabla de valores ayuda a visualizar cómo crecen distintas funciones de costo.

function costos(n) {
  return {
    n,
    lineal: n,
    cuadratico: n * n,
    logaritmico: Math.round(Math.log2(n) * 100) / 100
  };
}

console.log(costos(10));
console.log(costos(100));
console.log(costos(1000));

64.18 Validar entradas

Una función usada dentro de un algoritmo debe controlar su dominio cuando sea necesario.

function raizSegura(x) {
  if (x < 0) {
    return "Entrada inválida";
  }

  return Math.sqrt(x);
}

console.log(raizSegura(25));
console.log(raizSegura(-4));

64.19 Aplicaciones en programación

  • Transformar datos de entrada.
  • Normalizar valores para gráficos o modelos.
  • Calcular costos y elegir mejores opciones.
  • Ordenar elementos con criterios personalizados.
  • Componer procesos a partir de funciones pequeñas.
  • Modelar la complejidad de algoritmos.

64.20 Errores comunes

  • No validar el dominio de una función matemática.
  • Mezclar transformaciones puras con efectos secundarios sin necesidad.
  • Usar una función de puntuación sin revisar sus pesos.
  • Ordenar datos con una comparación incorrecta.
  • No distinguir entre la función matemática y la función de código que la implementa.

64.21 Qué debes recordar de este tema

  • Las funciones transforman entradas en salidas dentro de los algoritmos.
  • Sirven para normalizar, limitar, clasificar, ordenar y optimizar.
  • Las funciones pequeñas y puras facilitan pruebas y composición.
  • Las funciones de costo ayudan a comparar opciones y algoritmos.
  • Validar entradas evita errores matemáticos y computacionales.

64.22 Conclusión

Las funciones matemáticas están presentes en muchos algoritmos, aunque no siempre se las nombre explícitamente. Usarlas con claridad permite construir programas más predecibles, reutilizables y fáciles de analizar.