"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
Suerte y al toro.
<< Anterior Siguiente >>