57. Sucesiones y patrones numéricos

Una sucesión organiza números siguiendo una regla. Detectar esa regla permite predecir valores y construir algoritmos repetitivos.

57.1 Introducción

Una sucesión es una lista ordenada de números. Cada número de la lista se llama término y ocupa una posición.

2, 4, 6, 8, 10, ...
Esta sucesión aumenta de 2 en 2.

En programación, las sucesiones aparecen en contadores, ciclos, animaciones, cálculos financieros y generación de datos.

57.2 Términos de una sucesión

Los términos suelen representarse con la letra a y un subíndice que indica la posición.

a₁ = primer término
a₂ = segundo término
aₙ = término en la posición n

La posición permite pedir un valor específico sin escribir toda la sucesión.

57.3 Regla de formación

La regla de formación indica cómo se obtiene cada término de la sucesión.

aₙ = 3n
Si n = 1, a₁ = 3
Si n = 2, a₂ = 6
Si n = 3, a₃ = 9

La regla permite calcular términos sin depender de una lista escrita manualmente.

57.4 Sucesiones finitas e infinitas

Una sucesión finita tiene una cantidad limitada de términos. Una sucesión infinita continúa indefinidamente.

Finita: 5, 10, 15, 20
Infinita: 5, 10, 15, 20, ...

En software, incluso una sucesión matemática infinita se calcula hasta un límite definido.

57.5 Generar una sucesión con JavaScript

Un ciclo permite construir los primeros términos de una sucesión.

function sucesionTriple(cantidad) {
  const terminos = [];

  for (let n = 1; n <= cantidad; n++) {
    terminos.push(3 * n);
  }

  return terminos;
}

console.log(sucesionTriple(8));

La variable n representa la posición del término.

57.6 Patrones por suma

Un patrón por suma agrega siempre la misma cantidad o cantidades reconocibles.

4, 7, 10, 13, 16, ...
Cada término aumenta en 3.

Este tipo de patrón se relaciona con las progresiones aritméticas.

57.7 Detectar diferencia constante

Si la diferencia entre términos consecutivos es siempre la misma, hay un patrón lineal.

function tieneDiferenciaConstante(valores) {
  if (valores.length < 2) {
    return true;
  }

  const diferencia = valores[1] - valores[0];

  for (let i = 2; i < valores.length; i++) {
    if (valores[i] - valores[i - 1] !== diferencia) {
      return false;
    }
  }

  return true;
}

console.log(tieneDiferenciaConstante([4, 7, 10, 13]));
console.log(tieneDiferenciaConstante([2, 4, 8, 16]));

Esta comprobación es útil para analizar datos simples.

57.8 Patrones por multiplicación

Algunas sucesiones multiplican por el mismo valor para pasar de un término al siguiente.

3, 6, 12, 24, 48, ...
Cada término se multiplica por 2.

Este tipo de patrón se relaciona con las progresiones geométricas.

57.9 Detectar razón constante

Si el cociente entre términos consecutivos es constante, existe un patrón multiplicativo.

function tieneRazonConstante(valores) {
  if (valores.length < 2) {
    return true;
  }

  if (valores[0] === 0) {
    return false;
  }

  const razon = valores[1] / valores[0];

  for (let i = 2; i < valores.length; i++) {
    if (valores[i - 1] === 0 || valores[i] / valores[i - 1] !== razon) {
      return false;
    }
  }

  return true;
}

console.log(tieneRazonConstante([3, 6, 12, 24]));
console.log(tieneRazonConstante([3, 6, 9, 12]));

La razón constante indica que cada término escala respecto del anterior.

57.10 Sucesiones definidas por fórmula explícita

Una fórmula explícita calcula un término usando directamente su posición.

aₙ = 2n + 1
a₁ = 3
a₂ = 5
a₃ = 7

No hace falta conocer los términos anteriores para calcular aₙ.

57.11 Fórmula explícita en código

La fórmula puede implementarse como una función que recibe la posición.

function terminoImpar(n) {
  return 2 * n + 1;
}

for (let n = 1; n <= 6; n++) {
  console.log(terminoImpar(n));
}

Este enfoque es directo y eficiente cuando se conoce la regla.

57.12 Sucesiones definidas por recurrencia

Una regla recurrente calcula un término usando uno o más términos anteriores.

a₁ = 2
aₙ = aₙ₋₁ + 4

Para calcular un término avanzado, primero deben calcularse los anteriores.

57.13 Recurrencia en JavaScript

La recurrencia puede implementarse acumulando valores dentro de un ciclo.

function sucesionPorRecurrencia(cantidad) {
  const terminos = [];
  let actual = 2;

  for (let i = 1; i <= cantidad; i++) {
    terminos.push(actual);
    actual = actual + 4;
  }

  return terminos;
}

console.log(sucesionPorRecurrencia(7));

La variable actual guarda el último término calculado.

57.14 Aplicaciones en programación

Los patrones numéricos ayudan a generar coordenadas, tamaños, tiempos, identificadores, niveles de dificultad y secuencias de animación.

function posicionesEnFila(cantidad, inicio, separacion) {
  const posiciones = [];

  for (let i = 0; i < cantidad; i++) {
    posiciones.push(inicio + i * separacion);
  }

  return posiciones;
}

console.log(posicionesEnFila(5, 20, 80));

Este ejemplo genera posiciones igualmente separadas para elementos de una interfaz o un juego.

57.15 Conclusión

Las sucesiones permiten describir listas ordenadas de valores mediante reglas. En programación, estas reglas se transforman en ciclos, funciones y algoritmos generadores.

Una sucesión tiene términos, posiciones y una regla que permite calcular nuevos valores.

En el próximo tema se estudiarán las progresiones aritméticas, un caso muy importante de sucesiones con diferencia constante.