32. Funciones definidas por tramos

Una función definida por tramos usa distintas fórmulas según el intervalo donde se encuentra la entrada. Es una forma natural de traducir reglas condicionales a matemáticas y programación.

32.1 Introducción

Muchas reglas reales no se describen con una sola fórmula. Una tarifa puede cambiar según el consumo, un impuesto puede depender de rangos, una bonificación puede aplicarse solo a partir de cierto valor y una regla de juego puede variar según el nivel.

Las funciones definidas por tramos permiten expresar estas situaciones usando una fórmula distinta para cada condición.

32.2 Definición

Una función definida por tramos asigna una expresión diferente según el intervalo o condición que cumple la entrada.

f(x) = x + 2, si x < 0 f(x) = x², si x ≥ 0

Para evaluar la función, primero se decide qué condición cumple x y luego se usa la fórmula correspondiente.

32.3 Relación con condicionales

En programación, una función por tramos se implementa casi directamente con if, else if y else.

function f(x) {
  if (x < 0) {
    return x + 2;
  }

  return x ** 2;
}

console.log(f(-3));
console.log(f(0));
console.log(f(4));

32.4 Cuidar los límites

Los límites de cada tramo deben quedar bien definidos. Es importante decidir qué ocurre exactamente en los puntos de cambio.

f(x) = 2x, si x < 5 f(x) = 10, si x ≥ 5

En este caso, x = 5 pertenece al segundo tramo porque la condición es x ≥ 5.

32.5 Tabla de valores

Para la función anterior:

x Tramo usado f(x)
3 2x 6
4.9 2x 9.8
5 10 10
8 10 10

32.6 Ejemplo: valor absoluto

El valor absoluto es una función por tramos.

|x| = -x, si x < 0 |x| = x, si x ≥ 0
function valorAbsolutoPorTramos(x) {
  if (x < 0) {
    return -x;
  }

  return x;
}

console.log(valorAbsolutoPorTramos(-8));
console.log(valorAbsolutoPorTramos(8));

32.7 Continuidad en el punto de cambio

Una función por tramos puede ser continua o tener saltos. Para revisar un punto de cambio, comparamos el valor que producen los tramos a izquierda y derecha.

f(x) = 2x, si x < 5 f(x) = 10, si x ≥ 5

Al acercarse a 5 por la izquierda, 2x se acerca a 10. En x = 5, el segundo tramo vale 10. No hay salto.

32.8 Ejemplo con salto

Si los valores de los tramos no coinciden en el punto de cambio, aparece una discontinuidad.

g(x) = x, si x < 0 g(x) = x + 5, si x ≥ 0

Cerca de 0 por la izquierda, la función se acerca a 0. Pero en 0, el segundo tramo vale 5.

32.9 Implementar varios tramos

Una función puede tener más de dos tramos. En código se implementa con varias condiciones ordenadas.

function tarifa(consumo) {
  if (consumo <= 100) {
    return consumo * 10;
  }

  if (consumo <= 300) {
    return 1000 + (consumo - 100) * 15;
  }

  return 4000 + (consumo - 300) * 20;
}

console.log(tarifa(80));
console.log(tarifa(200));
console.log(tarifa(400));

32.10 Aplicación: descuentos por cantidad

Una tienda puede aplicar distintos descuentos según la cantidad comprada.

function descuento(cantidad) {
  if (cantidad < 10) {
    return 0;
  }

  if (cantidad < 50) {
    return 0.1;
  }

  return 0.2;
}

function precioFinal(cantidad, precioUnitario) {
  const subtotal = cantidad * precioUnitario;
  return subtotal * (1 - descuento(cantidad));
}

console.log(precioFinal(5, 100));
console.log(precioFinal(20, 100));
console.log(precioFinal(60, 100));

32.11 Aplicación: reglas de juego

En un juego, la experiencia necesaria para subir de nivel puede cambiar por rangos.

function experienciaNecesaria(nivel) {
  if (nivel <= 10) {
    return 100 * nivel;
  }

  if (nivel <= 30) {
    return 1000 + 200 * (nivel - 10);
  }

  return 5000 + 500 * (nivel - 30);
}

console.log(experienciaNecesaria(5));
console.log(experienciaNecesaria(20));
console.log(experienciaNecesaria(40));

32.12 Generar puntos para graficar

Al graficar funciones por tramos, conviene evaluar la función en varios puntos y revisar si hay saltos en los límites.

function g(x) {
  if (x < 0) {
    return x;
  }

  return x + 5;
}

function generarTabla(desde, hasta) {
  const tabla = [];

  for (let x = desde; x <= hasta; x++) {
    tabla.push({ x, y: g(x) });
  }

  return tabla;
}

console.log(generarTabla(-3, 3));

32.13 Representar tramos como datos

En algunos programas es útil describir cada tramo como un objeto con una condición y una fórmula.

const tramos = [
  {
    condicion: x => x < 0,
    formula: x => -x
  },
  {
    condicion: x => x >= 0,
    formula: x => x
  }
];

function evaluarPorTramos(x) {
  const tramo = tramos.find(t => t.condicion(x));
  return tramo ? tramo.formula(x) : null;
}

console.log(evaluarPorTramos(-4));
console.log(evaluarPorTramos(4));

32.14 Reglas completas y sin superposición

Las condiciones de una función por tramos deben cubrir los valores esperados y no deberían contradecirse entre sí.

Problema Consecuencia
Falta un intervalo La función no sabe qué devolver para algunos valores
Dos tramos cubren el mismo valor El resultado depende del orden de las condiciones
No se define qué pasa en el límite Aparecen errores en valores como 0, 10 o 100

32.15 Aplicaciones en programación

  • Tarifas por rangos de consumo.
  • Impuestos y descuentos escalonados.
  • Reglas de dificultad en videojuegos.
  • Animaciones con fases distintas.
  • Modelos que cambian de fórmula según el contexto.

32.16 Errores comunes

  • No definir qué ocurre exactamente en los puntos límite.
  • Usar condiciones superpuestas sin intención.
  • Dejar intervalos sin cubrir.
  • Ordenar mal los if cuando las condiciones dependen de rangos.
  • Graficar una función con saltos como si fuera continua.

32.17 Qué debes recordar de este tema

  • Una función por tramos usa distintas fórmulas según la condición de entrada.
  • En programación se implementa naturalmente con condicionales.
  • Los límites de cada tramo deben estar bien definidos.
  • Una función por tramos puede ser continua o tener saltos.
  • Conviene revisar que las condiciones cubran todos los valores necesarios.
  • El valor absoluto es un ejemplo clásico de función definida por tramos.

32.18 Conclusión

Las funciones definidas por tramos conectan directamente matemáticas y programación: cada tramo equivale a una regla condicional. Son muy útiles para representar sistemas donde el comportamiento cambia según rangos o estados.

En el próximo tema veremos funciones escalonadas, un caso particular donde la salida cambia por niveles.