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

Practica esta lección

Estos problemas ejercitan exactamente lo que acabas de leer: