Lección 6
Funciones
Respuesta corta: una función es un bloque de código con nombre, con entradas (parámetros) y una salida (el valor de retorno). Llámala por su nombre en vez de copiar su cuerpo.
La función útil más pequeña
#include <iostream>
using namespace std;
int cuadrado(int x) {
return x * x;
}
int main() {
cout << cuadrado(3) << endl;
cout << cuadrado(7) << endl;
return 0;
}
Tres partes: tipo de retorno (int), nombre (cuadrado), lista de parámetros (int x). El cuerpo returna un valor de ese tipo.
¿Para qué molestarse? Para dejar de repetirte
Compara dos versiones del mismo programa:
#include <iostream>
using namespace std;
bool esPar(int n) {
return n % 2 == 0;
}
int main() {
int cuenta = 0;
for (int i = 1; i <= 10; i++) {
if (esPar(i)) cuenta++;
}
cout << cuenta << " numeros pares" << endl;
return 0;
}
Ahora la definición de «par» vive en un solo sitio. Si la regla cambia, cambias una línea en vez de diez. Ese es todo el argumento a favor de las funciones.
Devolver frente a imprimir
Una función que devuelve se puede reutilizar en aritmética; una que imprime, no:
#include <iostream>
using namespace std;
int sumar(int a, int b) {
return a + b;
}
int main() {
int total = sumar(2, 3) * 10; // posible: sumar() da un valor
cout << total << endl;
return 0;
}
Prefiere devolver. Imprime en el nivel superior (main), calcula en las funciones.
Funciones que se llaman a sí mismas: recursión
El factorial es el caso de libro — n! = n × (n−1)!:
#include <iostream>
using namespace std;
long long factorial(int n) {
if (n <= 1) return 1; // caso base — sin él, recursión infinita
return n * factorial(n - 1);
}
int main() {
cout << factorial(5) << endl; // 120
return 0;
}
La recursión necesita un caso base que detenga el descenso. Sigue leyendo: un artículo entero sobre recursión, y los problemas Todas las permutaciones y Torres de Hanói.
Los tres bugs
- Alguna ruta no devuelve. Una función declarada
intque llega al final sin return da basura indefinida. - Paso por valor. Cambiar un parámetro no cambia la variable del llamador. (El artículo completo.)
- Falta el caso base en recursión. El programa revienta por desbordamiento de pila en vez de imprimir un número.