Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2024/2025

"Ejemplos de errores de programación básica relacionados con lo que devuelven o no las funciones", o "Cómo es posible aprobar dos asignaturas de programación de primer curso sin saber esto"

La instrucción return se puede usar de dos maneras:

  1. Sin argumento, para terminar una función sin devolver nada: escribiendo return;. Eso podemos hacerlo en funciones cuyo tipo de valor devuelto es void, es decir, que no tienen que devolver ningún resultado.

  2. Con argumento, para terminar una función devolviendo un resultado: escribiendo return seguida del resultado a devolver (puede ser una expresión que calcule el resultado). Eso podemos hacerlo en funciones cuyo tipo de valor devuelto no es void, es decir, que tienen que devolver un resultado.

En los siguientes dos ejemplos, se está utilizando correctamente return con argumento para devolver un resultado en una función que debe devolver un resultado:

Sin embargo, lo que se hace en los siguientes ejemplos, que ilustran errores típicos de estudiantes, es incorrecto, por alguno de estos motivos:

  1. no devolver ningún resultado en funciones que deben devolverlo;

  2. en funciones que no deben devolver ningún resultado, tratar de devolverlo o trabajar como si lo devolvieran;

  3. llamar a una función para obtener el resultado que devuelve y no hacer nada con él.

Error 1

int factorial (int n) {

   if (n <= 1)
      return 1;
   else
      n * factorial(n - 1);

}

int main () {

   cout << factorial(7);

}
	

En el ejercicio 17.b del tema 1 puedes ver una forma correcta de hacer eso.

Error 2

void mostrarVectorAlReves(const vector<int> & v, int fin) {

   if (fin >= 0) {
      cout << v[fin] << endl;
      return mostrarVectorAlReves(v, fin - 1);
   }

}

void mostrarVectorAlReves(const vector<int> & v) {

   return mostrarVectorAlReves(v, v.size() - 1);

}
	

En esta solución del tema 1 puedes ver una forma correcta de hacer eso.

Error 3

void mostrarVectorAlReves(const vector<int> & v, int fin) {

   if (fin >= 0) {
      cout << v[fin] << endl;
      cout << mostrarVectorAlReves(v, fin - 1);
   }

}

void mostrarVectorAlReves(const vector<int> & v) {

   cout << mostrarVectorAlReves(v, v.size() - 1);

}
	

En esta solución del tema 1 puedes ver una forma correcta de hacer eso.

Error 4

bool buscarDato(const vector<int> & v, int dato, int fin) {

   if (fin < 0)
      return false;
   
   buscarDato(v, dato, fin - 1);

   return v[fin] == dato;
   
}

bool buscarDato(const vector<int> & v, int dato) {
   
   return buscarDato(v, dato, v.size() - 1);

}
	

En esta solución del tema 1 puedes ver una forma correcta de hacer eso.