¡Domina las Declaraciones de Funciones con Parámetros y Funciones Recursivas de Forma Fácil y Rápida!post-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

Introducción a las Funciones

Las funciones en programación son una parte fundamental de la filosofía de diseño en muchos lenguajes, como el Lenguaje C. Una función o subprograma es un bloque de código que realiza alguna operación específica.

Los subalgoritmos son unidades de programa o módulos que están diseñados para ejecutar una tarea específica. El módulo principal se ejecuta en una primera instancia, que da la orden de inicio de ejecución de los subprogramas. El subprograma es un programa en sí mismo, ejecutado por la solicitud del programa principal o de otro subprograma, una cantidad n de veces.

Una función incluye en su interior un cierto código que tiene un determinado propósito. De esta forma, al llamar a la función se ejecutará el código que contiene realizando una determinada tarea. Al usar funciones evitamos repetir en nuestro programa el mismo código o código similar una y otra vez. Ese conjunto de instrucciones que utilizamos frecuentemente, lo incluimos en una función.

Las funciones también aportan claridad y legibilidad al código. Además, permiten verificar el código con más facilidad. El código contenido en una función puede llamar a otras funciones. La función puede ser invocada, o llamada, desde cualquier lugar del programa. No hay ningún límite práctico para la longitud de la función, pero el buen diseño tiene como objetivo las funciones que realizan una sola tarea bien definida.

Las funciones son útiles para encapsular las operaciones comunes en un solo bloque reutilizable, idealmente con un nombre que describa claramente lo que hace la función. Un programa en C está compuesto por una o varias funciones. Un programa siempre contiene una función llamada main que es el punto de entrada del programa.

Lea también: Proceso de Verificación de Declaraciones SAT

Declaración y Definición de Funciones

Al igual que con el uso de variables, una función debe declararse antes del lugar donde se define. Declarar una función consiste en especificar el tipo de dato que va a regresar y la función. En la declaración se debe especificar el tipo y el número de argumentos. La declaración avisa al compilador que la función existe y que se definirá después.

En C++ es obligatorio usar prototipos. Un prototipo es una declaración de una función. Consiste en una presentación de la función, exactamente con la misma estructura que la definición, pero sin cuerpo y terminada con un punto y coma.

Una declaración de función mínima consta del tipo de valor devuelto, el nombre de la función y la lista de parámetros (que puede estar vacío), junto con palabras clave opcionales que proporcionan más instrucciones al compilador. Una declaración de función seguida de un punto y coma puede aparecer en varios lugares de un programa. Debe aparecer antes de cualquier llamada a esa función en cada unidad de traducción.

Una definición de función consiste en la declaración y el cuerpo de la función, encerrado entre llaves, que contiene declaraciones de variables, sentencias y expresiones. El identificador de la función es recomendable poner nombres que indiquen lo más claramente posible lo que hace la función y que permita interpretar lo que hace el programa con solo leerlos.

Sintaxis de la Definición de una Función:

tipo_de_dato nombre_funcion (tipo_de_argumento argumento1, tipo_de_argumento argumento2, . . . , tipo_de_argumento argumento_n)
{
definición de variables locales;
sentencias;
return;
}

Lea también: Requisitos para Declaraciones Atrasadas

  • tipo_de_dato: Tipo de dato devuelto por la función. En C++ es obligatorio indicar el tipo del valor de retorno.
  • nombre_funcion: El nombre con que se identifica la función para mandarla llamar.
  • tipo_de_argumento: Listado de variables, que conforman los datos que se pasarán a la función.
  • sentencias: Estructura de código que ejecutará una tarea específica.

El tipo de dato de retorno puede ser omitido, por default devuelve un entero. Una función que no devuelve ningún valor al código que la invoca tendrá como tipo de retorno void. Podemos pensar en el significado de void como 'nada' o 'ninguno'. Una función declarada con la palabra clave única void en la lista de declaración de parámetros no toma argumentos, siempre que la palabra clave void sea el primer y único miembro de la lista de declaración de argumentos.

Parámetros de Funciones

Los parámetros o argumentos en las funciones de programación son valores que se pasan a una función desde fuera de ella y que la función recibe y puede usar y procesar. Una función puede definir opcionalmente parámetros de entrada que permiten a los llamadores pasar argumentos a la función. Los parámetros son los inputs que puede recibir la función y son una herramienta muy potente que nos permite que las funciones sean mucho más reusables.

Una función tiene una lista de parámetros separados por comas de cero o más tipos, cada uno de los cuales tiene un nombre mediante el cual se puede acceder a ellos dentro del cuerpo de la función. Cada parámetro consta de un tipo y un identificador, lo cual es equivalente a declarar una variable.

Los parámetros de una función son variables que se inicializan con los valores de los argumentos. Los parámetros de una función son los valores de entrada y, en ocasiones, también de salida. La lista de parámetros son los parámetros formales. Cuando se llama a una función desde el algoritmo principal, se establece automáticamente una correspondencia entre los parámetros formales y los reales.

Cuando se realice una llamada a la función es necesario enviar un argumento por cada uno de los parámetros. Cuando se llama a la función, se realiza una copia de cada uno de los argumentos y se asigna su valor al parámetro correspondiente. Por ello, a la hora de llamar a una función se le pueden enviar datos que llamaremos argumentos.

Lea también: Obtener el acuse de tus declaraciones

Paso de Parámetros por Valor

Los datos de entrada son datos que enviamos a la función para que realice su cometido. La función no va a modificarles. Los datos de entrada se pasan por valor, es decir, se copia el valor del argumento (el contenido de la variable) en el parámetro correspondiente de la función. Por defecto, los argumentos se pasan a la función por valor, lo que significa que la función recibe una copia del objeto que se pasa.

En C++ el paso por valor significa que al compilar la función y el código que llama a la función, ésta recibe una copia de los valores de los parámetros que se le pasan como argumentos. Las variables reales no se pasan a la función, solo copias de su valor. Aunque el procedimiento les cambie su valor, este nuevo valor no se refleja en el programa llamador. Esto se debe a que en la llamada al subprograma, se le asigna el valor del parámetro real a la variable que representa al parámetro formal correspondiente, dicho de otra forma, se crea una copia del parámetro real. Son los parámetros unidireccionales, que se usan para dar información al subprograma, pero no pueden devolver valores desde el mismo.

Paso de Parámetros por Referencia

Cuando una función debe modificar el valor de la variable pasada como parámetro y que esta modificación retorne a la función llamadora, se debe pasar el parámetro por referencia. En este método, el compilador no pasa una copia del valor del argumento; en su lugar, pasa una referencia, que indica a la función dónde existe la variable en memoria. La referencia que una función recibe es la dirección de la variable. Es decir, pasar un argumento por referencia es, simplemente, indicarle al compilador que pase la dirección del argumento.

Los datos de salida se pasan por referencia, es decir, lo que se copia en el parámetro no es el contenido del argumento (su valor) sino la dirección de memoria donde reside dicho dato (un puntero o referencia). Cuando una función modifica un argumento que se pasa por referencia, modifica el objeto original, no una copia local. Así, todo cambio realizado sobre los parámetros formales precedidos por "ref." (o mecanismo equivalente), se refleja en los parámetros reales correspondientes. Una función puede tener parámetros variables además de parámetros valor en la lista de parámetros formales.

Existen diferentes métodos para el paso de parámetros a subprogramas. Es preciso conocer el método adoptado por cada lenguaje, ya que la elección puede afectar a la semántica del código.

Es posible que una función no tenga parámetros ya que no necesita ningún dato para realizar su tarea. En ese caso los paréntesis en su definición irán vacíos.

Consejo: Es importante tener en cuenta que una función no debería tener un número excesivo de parámetros.

Valores de Retorno

Una función también puede devolver un valor como salida. Es posible que una función realice una tarea y necesite comunicar un resultado al código que la ha invocado. Cuando una función devuelve un valor es obligatorio que dentro de la función exista una instrucción return seguida del valor a devolver (una variable, un literal o una expresión en general). Al finalizar las sentencias dentro de la función, devuelve un valor. Para devolver un valor determinado se utiliza la expresión return; y enseguida se escribe el valor de retorno.

El tipo de retorno especifica el tipo del valor que devuelve la función. En ese sentido podemos pensar que una función, cuando tiene un valor de retorno, es equivalente a una variable. Una función que no devuelve ningún valor al código que la invoca tendrá como tipo de retorno void.

En Lenguaje C se pueden devolver valores del tipo escalares. Los datos escalares, se les llama escalares a los tipos de datos int, char, long, float o double. No se pueden devolver arrays o estructuras. Se puede definir una función que no regrese un valor usando el tipo de retorno void. En principio todas las funciones devuelven por defecto un valor entero.

Dentro del cuerpo de una función pueden existir múltiples ocurrencias de return + valor. En ocasiones puede ser necesario que una función devuelva más de un valor al finalizar su ejecución. Esto se consigue permitiendo a la función escribir valores en sus parámetros (que pueden ser muchos), para que los reciba el código que la ha llamado en sus argumentos. Esto requiere una forma especial de tratar dichos argumentos y parámetros. Además de utilizar el valor de retorno en sí mismo, puede "devolver" valores definiendo cualquier número de parámetros para utilizar el pasado por referencia de manera que la función pueda modificar o inicializar los valores de los objetos que el autor de la llamada proporciona.

Una función no puede devolver otra función, o una matriz incorporada; sin embargo, puede devolver punteros a estos tipos, o una lambda, que produce un objeto de función. Un tipo de valor devuelto "normal" se encuentra en el lado izquierdo de la firma de función. Un tipo de valor devuelto final se encuentra en el lado derecho de la firma y va precedido por el operador ->.

En C++11, auto es un tipo de retorno válido que indica al compilador que infiera el tipo de la sentencia de retorno. En C++14, decltype(auto) también está permitido. En C++14, se puede usar auto para indicar al compilador que deduzca el tipo de retorno del cuerpo de la función sin tener que proporcionar un tipo de retorno al final. Tenga en cuenta que auto siempre se deduce a un retorno por valor. Para las funciones de reenvío cuyo valor de retorno necesita preservar como constante o referencia de sus argumentos, puede usar la palabra clave decltype(auto), que usa las reglas de inferencia de tipos decltype y preserva toda la información de tipos.

Ámbito de las Variables

El ámbito de una variable es el lugar en el código fuente donde esta variable se puede usar. Las variables declaradas dentro del cuerpo de una función se denominan variables locales. Una variable local que se declara dentro de un subprograma, y se dice que es local al subprograma. Las variables locales no estáticas solo son visibles dentro del cuerpo de la función y, si se declaran en la pila, salen del ámbito cuando se cierra la función. Cuando se construye una variable local y se devuelve por valor, el compilador suele realizar la optimización del valor de retorno con nombre para evitar operaciones de copia innecesarias. En C++, una variable local se puede declarar como estática. La variable solo es visible dentro del cuerpo de la función, pero existe una copia única de la variable para todas las instancias de la función. Los objetos estáticos locales se destruyen durante la finalización especificada por atexit.

Las variables declaradas en el programa principal se llaman globales, pues pueden ser utilizadas en el programa principal y en todos los subprogramas en él declarados. Podemos definir variables globales, que serán visibles en todo el módulo. Si existen dos variables con el mismo nombre, pero una es global y la otra es local, dentro del subprograma tiene prioridad la variable local de igual nombre.

Cada función tiene internamente sus propias variables y una función no tiene acceso a las variables declaradas en otra. Una función puede cambiar el contenido de una variable global y ejecutar instrucciones de entrada/salida.

Errores de Efecto Lateral

Un ERROR DE EFECTO LATERAL se produce al realizarse un cambio de nombre, de naturaleza o eliminación de una variable global, que afecta al subprograma. Si un procedimiento modifica una variable global (distinta de un parámetro real), este es un efecto lateral. Por ello, excepto en contadas ocasiones, no debe aparecer en la declaración del procedimiento. Si se necesita una variable temporal en un procedimiento, se debe utilizar una variable local, no una global.

Funciones Recursivas

Un subprograma que se puede llamar a sí mismo se llama recursivo. Una función es recursiva cuando se invoca a sí misma. La recursividad consiste en una función que se llama a sí misma para resolver un cierto problema. La recursión puede ser utilizada como una alternativa a la repetición o estructura repetitiva.

La solución recursiva consiste en ir generando una cola de llamadas de la función a sí misma hasta llegar al caso base, como el factorial de 1 que devuelve un 1, y se van resolviendo todas las funciones en orden inverso hasta devolver el resultado. Los algoritmos recursivos suelen ser más expresivos y, sin duda, son fundamentales para resolver ciertos problemas complejos.

Por ejemplo, en un problema donde se eliminan elementos adyacentes de un mismo tipo, se puede crear una función que se llama a sí misma para cada elemento en su contorno, y por último, se elimina a sí mismo.

tags: #declaraciones #de #funciones #simples #con #parámetros