[Curso] Introducción a la programación en C (XIII)
Publicado: 22 Oct 2010, 09:30
<< Anterior Siguiente >>
"El ordenador es sólo un idiota rapidísimo" - Anónimo
Localidad de variables
Con localidad o visibilidad de variables, nos referimos a qué partes del código reconocen una variable. Las variables declaradas dentro de una función sólo son reconocidas por dicha función. Por ejemplo:
Esto nos daría un error de compilación, ya que el compilador no sabría decir qué es a para funcionB. Es decir, las declaraciones de las variables son locales, y por tanto sólo se pueden considerar dentro del ámbito de la función.
Se llaman variables globales a las que no están declaradas dentro de ninguna función. Estas variables son accesibles desde cualquier parte del programa. Por ejemplo:
Esto es perfectamente válido y compila sin problemas porque a es global. Si hubiésemos declarado otra variable local a en funcionB, ésta pasaría por encima de la a global, es decir, la variable a global no podría ser referenciada por funcionB, sino que todas los accesos a a se referirán a la a local, no la global.
No se recomienda el uso de variables globales ya que pueden ser origen de errores muy difíciles de detectar y corregir.
Recursividad
Bueno, empezamos con las cosas serias sobre funciones. Éste es de los temas que más le cuesta entender a la gente, y con razón.
Se llama recursividad a cualquier proceso que implique que una misma función se llame a sí mismo un número determinado de veces. Es un concepto parecido al bucle, y que generalmente realiza la misma función, pero la recursividad queda más bonita y elegante, aunque generalmente suele ser más lenta que un bucle.
Existen lenguajes de programación que se basan masivamente en la recursividad, como por ejemplo Haskell o LISP, que se basan en una filosofía de programación llamada funcional, en contraste con C que es imperativo.
Veamos un ejemplo de función recursiva, por ejemplo el cálculo de un número factorial (que ya vimos en el tema anterior):
Como vemos, el código es muchísimo más corto y sencillo, y no se usan variables locales a la función factorial().
Os dejo con algunos ejercicios para este tema. No debéis utilizar variables locales en las funciones recursivas.
Si conseguís entender la recursividad, habréis dado un gran paso adelante en la comprensión de funciones, y de la programación en general.
Para ser sincero, no espero que muchos entendáis esto, pero tengo esperanzas en que alguno sí lo haga
Suerte y al toro.
<< Anterior Siguiente >>
"El ordenador es sólo un idiota rapidísimo" - Anónimo
Localidad de variables
Con localidad o visibilidad de variables, nos referimos a qué partes del código reconocen una variable. Las variables declaradas dentro de una función sólo son reconocidas por dicha función. Por ejemplo:
Código: Seleccionar todo
int funcionA(void)
{
int a = 0;
return a;
}
int funcionB(void)
{
a = 1;
return a;
}
Esto nos daría un error de compilación, ya que el compilador no sabría decir qué es a para funcionB. Es decir, las declaraciones de las variables son locales, y por tanto sólo se pueden considerar dentro del ámbito de la función.
Se llaman variables globales a las que no están declaradas dentro de ninguna función. Estas variables son accesibles desde cualquier parte del programa. Por ejemplo:
Código: Seleccionar todo
int a;
int funcionB(void)
{
a = 1;
return a;
}
int main(int argc, char* argv[])
{
a = 0;
print("%d\n", a);
print("%d\n", funcionB());
return 0;
}
Esto es perfectamente válido y compila sin problemas porque a es global. Si hubiésemos declarado otra variable local a en funcionB, ésta pasaría por encima de la a global, es decir, la variable a global no podría ser referenciada por funcionB, sino que todas los accesos a a se referirán a la a local, no la global.
No se recomienda el uso de variables globales ya que pueden ser origen de errores muy difíciles de detectar y corregir.
Recursividad
Bueno, empezamos con las cosas serias sobre funciones. Éste es de los temas que más le cuesta entender a la gente, y con razón.
Se llama recursividad a cualquier proceso que implique que una misma función se llame a sí mismo un número determinado de veces. Es un concepto parecido al bucle, y que generalmente realiza la misma función, pero la recursividad queda más bonita y elegante, aunque generalmente suele ser más lenta que un bucle.
Existen lenguajes de programación que se basan masivamente en la recursividad, como por ejemplo Haskell o LISP, que se basan en una filosofía de programación llamada funcional, en contraste con C que es imperativo.
Veamos un ejemplo de función recursiva, por ejemplo el cálculo de un número factorial (que ya vimos en el tema anterior):
Código: Seleccionar todo
// Calcula el factorial de un número por recursividad
unsigned long factorial(unsigned long n)
{
// Si n es 1 o 0, el factorial es 1
if (n <= 1)
return n;
// Si n es > 1, n! = n * (n-1)!
else
return n * factorial(n-1);
}
Como vemos, el código es muchísimo más corto y sencillo, y no se usan variables locales a la función factorial().
Os dejo con algunos ejercicios para este tema. No debéis utilizar variables locales en las funciones recursivas.
- Implementar un programa que busca el número máximo en un vector de 20 enteros con signo introducidos por el usuario usando recursividad.
- Implementar un programa que busca el número máximo en un vector de 20 enteros con signo aleatorios (el signo de cada elemento también debe ser aleatorio) usando recursividad.
- Implementar un programa que eleva un número a una potencia, ambos dados por el usuario, usando una sola función recursiva.
- Implementar un programa que sume los elementos de un array usando funciones recursivas.
- Implementar un programa que sume sólo los elementos pares de un array usando funciones recursivas.
- La secuencia de números de Fibonacci es 0,1,1,2,3,5,8,13,21... Implementar un programa que use una función recursiva que calcule la secuencia de Fibonacci hasta un número máximo dado por el usuario.
- Implementar la agenda telefónica de los temas anteriores usando recursividad en lugar de los bucles de búsqueda. Añadir una función de búsqueda recursiva de número y/o nombre de forma recursiva. A ver quién hace el mejor motor de búsqueda
Si conseguís entender la recursividad, habréis dado un gran paso adelante en la comprensión de funciones, y de la programación en general.
Para ser sincero, no espero que muchos entendáis esto, pero tengo esperanzas en que alguno sí lo haga
![Guiño ;)](./images/smilies/icon_e_wink.gif)
Suerte y al toro.
<< Anterior Siguiente >>