La recursivitat és una tècnica de programació on una funció es crida a si mateixa per resoldre un problema. Aquesta tècnica és molt útil per a problemes que es poden dividir en subproblemes més petits del mateix tipus. En aquest tema, aprendrem què és la recursivitat, com funciona, i veurem alguns exemples pràctics.
Conceptes Clau
- Funció Recursiva: Una funció que es crida a si mateixa.
- Cas Base: La condició que atura la recursió per evitar un bucle infinit.
- Cas Recursiu: La part de la funció que inclou la crida recursiva.
Com Funciona la Recursivitat
Quan una funció es crida a si mateixa, es crea una nova instància de la funció amb els seus propis paràmetres i variables locals. Aquest procés continua fins que es compleix el cas base, moment en què la funció comença a retornar valors i les instàncies anteriors es resolen una per una.
Exemple Bàsic: Factorial d'un Nombre
El factorial d'un nombre n
(denotat com n!
) és el producte de tots els nombres enters positius menors o iguals a n
. Per exemple, 5! = 5 * 4 * 3 * 2 * 1 = 120
.
Implementació Iterativa
#include <iostream> using namespace std; int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } int main() { int number = 5; cout << "Factorial de " << number << " és " << factorial(number) << endl; return 0; }
Implementació Recursiva
#include <iostream> using namespace std; int factorial(int n) { if (n <= 1) { // Cas Base return 1; } else { // Cas Recursiu return n * factorial(n - 1); } } int main() { int number = 5; cout << "Factorial de " << number << " és " << factorial(number) << endl; return 0; }
Explicació del Codi Recursiu
- Cas Base:
if (n <= 1) return 1;
- Quan
n
és 1 o menys, la funció retorna 1, aturant la recursió.
- Quan
- Cas Recursiu:
return n * factorial(n - 1);
- La funció es crida a si mateixa amb
n - 1
fins que arriba al cas base.
- La funció es crida a si mateixa amb
Exemple Avançat: Seqüència de Fibonacci
La seqüència de Fibonacci és una sèrie de nombres on cada nombre és la suma dels dos anteriors. Els primers dos nombres són 0 i 1. La seqüència comença així: 0, 1, 1, 2, 3, 5, 8, ...
Implementació Recursiva
#include <iostream> using namespace std; int fibonacci(int n) { if (n <= 1) { // Cas Base return n; } else { // Cas Recursiu return fibonacci(n - 1) + fibonacci(n - 2); } } int main() { int number = 10; cout << "El " << number << "è nombre de Fibonacci és " << fibonacci(number) << endl; return 0; }
Explicació del Codi
- Cas Base:
if (n <= 1) return n;
- Quan
n
és 0 o 1, la funció retornan
, aturant la recursió.
- Quan
- Cas Recursiu:
return fibonacci(n - 1) + fibonacci(n - 2);
- La funció es crida a si mateixa amb
n - 1
in - 2
fins que arriba al cas base.
- La funció es crida a si mateixa amb
Exercicis Pràctics
- Sumar Nombres Naturals: Escriu una funció recursiva que sumi els primers
n
nombres naturals. - Potència d'un Nombre: Escriu una funció recursiva que calculi
a^b
(a elevat a la potència b). - Inversió d'una Cadena: Escriu una funció recursiva que inverteixi una cadena de caràcters.
Solucions
- Sumar Nombres Naturals
- Potència d'un Nombre
- Inversió d'una Cadena
#include <iostream> #include <string> using namespace std; void invertirCadena(string &str, int start, int end) { if (start >= end) { return; } swap(str[start], str[end]); invertirCadena(str, start + 1, end - 1); } int main() { string str = "Hola, món!"; invertirCadena(str, 0, str.length() - 1); cout << "Cadena invertida: " << str << endl; return 0; }
Errors Comuns i Consells
- Oblidar el Cas Base: Sense un cas base, la funció recursiva entrarà en un bucle infinit.
- Desbordament de la Pila: Les funcions recursives poden consumir molta memòria si la profunditat de la recursió és massa gran.
- Optimització: Algunes funcions recursives poden ser optimitzades utilitzant tècniques com la memòria cau (memoization) per evitar càlculs repetits.
Resum
La recursivitat és una tècnica poderosa que permet resoldre problemes complexos de manera elegant. És important comprendre els conceptes de cas base i cas recursiu per implementar funcions recursives correctament. Amb la pràctica, podràs identificar quan és adequat utilitzar la recursivitat i com optimitzar les teves solucions per a una millor eficiència.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil