Curso 2023/2024
Piensa qué es lo que está mal en la siguiente solución.
int contarComunes(const vector<float> & v1, const vector<float> & v2, int pos1, int pos2) { if (pos1 >= v1.size() || pos2 >= v2.size()) return 0; if (v1[pos1] == v2[pos2]) return 1 + contarComunes(v1, v2, pos1++, pos2++); if (v1[pos1] < v2[pos2]) return contarComunes(v1, v2, pos1++, pos2); return contarComunes(v1, v2, pos1, pos2++); } int contarComunes(const vector<float> & v1, const vector<float> & v2) { return contarComunes(v1, v2, 0, 0); }
Es incorrecto pasar a la función el resultado de pos1++
en vez
de pos1 + 1
y el resultado de pos2++
en vez
de pos2 + 1
. Con eso lo que se está pasando a la función es lo que
valían pos1
y pos2
antes del
incremento.
Si no lo entiendes, piensa qué mostrará este código y pruébalo:
int a = 10; int b = a + 1; int c = a++; cout << "a = " << a << endl; cout << "b = " << b << endl; cout << "c = " << c << endl;
a++
incrementa a
y devuelve como resultado lo que valía a
antes del incremento. Lo que devuelve como resultado es lo que se guarda en
c
.
Pasar como argumento a + 1
es pasar lo que aquí se está guardando en b
.
Pasar como argumento a++
es pasar lo que aquí se está guardando en c
.
Es un concepto más que no quedó claro en primer curso de programación.
Ejercicio extra opcional
Opcionalmente, resuelve también este ejercicio_incrementar_decrementar.cpp y mira este ejemplo_incrementar.cpp.