[ ] Departament d’Informàtica Departamento de Informática Informática PRÀCTICA 8 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA Práctica Nº 8: Funciones: paso de parámetros por valor y por referencia. Recursividad Objetivos de la práctica: - Paso de parámetros por referencia en C++. - Diferencias entre el paso de parámetros por valor y por referencia. - Anidamiento de funciones. - Uso de la recursividad. Parámetros por valor y por referencia Los parámetros de una función se pueden definir de dos maneras: Por valor o por referencia. Paso por valor Este método copia el valor de los argumentos sobre los parámetros formales, de manera que los cambios de valor de los parámetros no afectan a las variables utilizadas como argumentos en la llamada. Lo importante en el paso por valor es el valor del argumento, por eso es indiferente si este argumento es una variable, una constante o una expresión. Paso por referencia en C++. A diferencia del paso por valor, en el paso por referencia los parámetros no copian el valor del argumento, sino que comparten su valor. Por lo que cuando cambia el valor del parámetro también cambia el valor de la variable utilizada como argumento en la llamada. La forma de indicar un parámetro por referencia es anexar el símbolo & al final del nombre de la variable de tipo en la lista de parámetros formales, tanto en el prototipo de la función como en el encabezado de su definición. Ejemplo: void obtener_entrada (double &temperatura) { cout << “Dame una temperatura en grados centígrados \n”; cin >> temperatura; } La llamada a la función desde el programa principal: Obtener_entrada (temperatura); Los parámetros definidos por referencia se pueden utilizar tanto de entrada como de salida de datos. Este es el otro mecanismo que poseen las funciones, a parte del return, para devolver valores. Una consecuencia evidente es que, en la llamada de la función, los argumentos por referencia han de ser siempre variables. Práctica Nº 8: Funciones: paso de parámetros por valor y por referencia. Recursividad 1/2 [ ] Departament d’Informàtica Departamento de Informática Informática PRÀCTICA 8 Curs 2002-2003 FACULTAT DE MATEMATIQUES UNIVERSITAT DE VALENCIA NOTAS: • En una misma función podemos utilizar parámetros por valor y parámetros por referencia. • Utilizar el paso por referencia si queremos que la función modifique el valor de la variable y en caso contrario usar paso por valor. • Cuando una función ha de devolver más de un valor es normal devolverlos mediante el uso de argumentos de la función pasados por referencia. Funciones que llaman a funciones Un cuerpo de función puede contener una llamada a otra función. La situación en este tipo de llamadas es exactamente la misma que si la llamada de función se hubiera efectuado en la función main del programa; la única restricción es que el prototipo debe aparecer antes de que se emplee la función. Recursividad Una función recursiva es aquella que se llama a sí misma. Esto se traduce en que dentro del código de un subprograma recursivo hay una sentencia o expresión donde aparece la llamada a la misma función. Para no crear secuencias de infinitas llamadas (ya que la función llamada, volverá a llamarse por ser a su vez recursiva) necesitamos dos elementos: 1. Las funciones recursivas deben tener argumentos, cuyos valores diferencien a una llamada de otra. 2. Debe existir una condición final o condición de parada, que utiliza la información de los argumentos para verificar si la recursión debe finalizar, en cuyo caso no se producen más llamadas. Evidentemente la secuencia de valores de los argumentos debe ser tal que se garantice que en algún momento se llegue a la condición final de la recursión. De no ser así, se producirá un error de Desbordamiento de Pila (Stack Overflow) que indica que las llamadas recursivas han saturado la memoria de la pila del programa. La recursividad está directamente relacionada con una técnica de programación llamada Divide y Vencerás, de tal manera que esta técnica nos puede ayudar a descubrir la forma que debe tener nuestra función recursiva. Esta técnica se basa en lo siguiente: frente a un problema, se realizan una serie de tareas básicas que nos llevan a tener el mismo problema pero de complejidad menor. Si esto lo aplicamos recursivamente, la resolución del problema se traduce en ejecutar una serie de tareas simples que nos desembocan al final en el mismo problema pero de una complejidad tan simple que es trivial resolverlo. Esta resolución se hace en la condición final de la recursión y se denomina Caso Base. Práctica Nº 8: Funciones: paso de parámetros por valor y por referencia. Recursividad 2/2