Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2022/2023

Ejemplo de error en el ejercicio 10.b del tema 1

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);

}
      

Solución

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.