int an = a1 * pow(r, n - 1);
Para r != 1
:
int Sn = a1 * (pow(r, n) - 1) / (r - 1);
|r| < 1
):La sumatoria (notación sigma: Σ) se usa para sumar una secuencia de términos.
int n = 10, sum = 0;
for (int i = 1; i <= n; ++i) {
sum += i;
}
La multiplicatoria o producto (notación pi: Π) se usa para multiplicar una secuencia de términos.
int n = 5, product = 1;
for (int i = 1; i <= n; ++i) {
product *= i;
}
break
: Termina el bucle o la declaración switch y transfiere el control a la declaración inmediatamente siguiente.for (int i = 1; i <= 10; ++i) {
if (i == 5) break;
cout << i << " ";
}
continue
: Omite la iteración actual de un bucle y continúa con la siguiente iteración.for (int i = 1; i <= 10; ++i) {
if (i == 5) continue;
cout << i << " ";
}
return
: Sale de una función y devuelve un valor al llamador.int sumar(int a, int b) {
return a + b;
}
int resultado = sumar(3, 4);
cout << resultado << endl;
goto
: Transfiere el control a una declaración etiquetada dentro de la misma función. (Nota: puede crear código ilegible y propenso a errores, pero también puede solucionar problemas con la recursión).int i = 1;
start:
if (i > 5) goto end;
cout << i << " ";
++i;
goto start;
end:
El nesting ocurre cuando anidamos condicionales dentro de otro. Esto lleva a un código difícil de leer.
inline void foo() {
if (var) {
if (qux) {
if (baz) {
cout << "Todas las condiciones son verdaderas";
} else {
cout << "baz es falso";
}
} else {
cout << "qux es falso";
}
} else {
cout << "var es falso";
}
}
Existen dos métodos para evitar el nesting y ser un never-nester: inversión y extracción.
Consiste en manejar los casos negativos primero y usar declaraciones return para salir del flujo de control lo antes posible.
inline void foo() {
if (!var) {
cout << "var es falso";
return;
}
if (!qux) {
cout << "qux es falso";
return;
}
if (!baz) {
cout << "baz es falso";
return;
}
cout << "Todas las condiciones son verdaderas";
}
Consiste en dividir el código en funciones más pequeñas y específicas para mejorar la legibilidad.
inline void checkBaz() {
if (!baz) {
cout << "baz es falso";
return;
} cout << "Todas las condiciones son verdaderas";
}
inline void checkQux() {
if (!qux) {
cout << "qux es falso";
return;
} checkBaz();
}
inline void foo() {
if (!var) {
cout << "var es falso";
return;
} checkQux();
}
El término branching se refiere a las condicionales, cuando el programa diverge en dos caminos puede llegar a ser lento en ciertos casos debido a que el CPU intenta adelantarse precagargando una de las funciones posibles. La metodologia branchless evita eso, pero puede volver menos legible la funcion.
inline int menorBranch(int a, int b) {
if (a < b)
return a;
return b;
}
inline int menorBranchLess(int a, int b) {
return a * (a < b) + b * (b <= a);
}
Las lambdas o funciones lambda permiten definir funciones anónimas de forma concisa. Son útiles para crear funciones cortas que se utilizan en el contexto de otra función, como en algoritmos STL.
La sintaxis básica de una lambda es:
[capturas](parámetros) -> tipo_retorno {
// Cuerpo de la función
};
Un ejemplo:
auto suma = [](int a, int b) -> int { return a + b; };
int res = suma(5, 3);
a_n es el término n-ésimo. a_1 es el primer término. n es el número del término. d es la diferencia común.
a_n es el término n-ésimo. a_1 es el primer término. n es el número del término. r es la razón común.
i=1: Es el índice de la sumatoria. En el código, es la variable de iteración del bucle for. Donde 1 es el valor inicial. n: Es el valor final del índice i. En el código, corresponde a la condición de paro del bucle i <= n. i: Es el término general que se suma. En el código, es lo que se suma a la variable sum en cada iteración sum += i.
i=1: Es el índice de la sumatoria. En el código, es la variable de iteración del bucle for. Donde 1 es el valor inicial. n: Es el valor final del índice i. En el código, corresponde a la condición de paro del bucle i <= n. i: Es el término general que se multiplica. En el código, es lo que se multiplica por la variable product en cada iteración product *= i.
auto nos ahorra escribir: std::function<int(int, int)> suma = [](int a, int b) -> int { return a + b; };