You are on page 1of 5

Algoritmos y Programacin I

FUNCIONES Y RECURSIN
1. Codifique una funcin que calcule el producto de dos enteros positivos en forma recursiva (sumas sucesivas).
2. Codifique una funcin que calcule el cociente de dos enteros positivos en forma recursiva (restas sucesivas).
3. Codifique una funcin que calcule el mximo comn divisor de dos enteros positivos por el mtodo de
Euclides en forma recursiva.
4. Codifique una funcin que calcule el mximo comn divisor de dos enteros positivos en forma recursiva por el
mtodo de Nicmaco de Gersasa, tambin llamado de las diferencias:

si a>b, entonces mcd(a, b) = mcd(a-b, b)

si a<b, entonces mcd(a, b) = mcd(a, b-a)

si a=b, entonces mcd(a, b) = mcd(b, a) = a = b

5. Escriba una funcin recursiva para calcular el trmino n-simo de la secuencia de Lucas: 1, 3, 4, 7, 11, 18, 29,
47 ...
6. Defina funciones recursivas para los siguientes clculos:
a. 1 + 1/2 + 1/3 + 1/n = (1 + 1/2 + 1/3 + 1/(n-1)) + 1/n
b. La potencia de un real elevado a un entero positivo:
x0 = 1

c.

xn = (x * x)n/2

si n > 0 y es par

xn = x * xn-1

si n > 0 y es impar

La cifra i-sima de un entero n; es decir,

la ltima, si i = 0
la cifra (i-1)-sima de n/10, en otro caso.

d. El coeficiente binomial C(n, k) del trmino xkyn-k al desarrollar (x + y)n, como


C(n, k) = C(n-1, k) * C(n-1, k-1) para enteros n, k > 0
C(n, 0) = 1 para enteros n 0
C(0, k) = 0 para enteros k > 0
7. Asumiendo que 0 es par, es decir,
EsPar ( 0 ) = 1
EsImpar ( 0 ) = 0

Pgina 1 de 5

Funciones y Recursin
y que la paridad de cualquier otro entero positivo es la opuesta que la del entero anterior, desarrolle las
funciones lgicas, mutuamente recursivas, EsPar y EsImpar, que se complementen a la hora de averiguar la
paridad de un entero positivo:
int EsPar( unsigned int n );
int EsImpar( unsigned int n );
{

}
int EsPar( unsigned int n );
{

}
8. Dados los siguientes archivos correspondientes a un proyecto, agregar al archivo header y al de su
implementacin (VecNat.h y VecNat.c respectivamente) funciones recursivas para buscar secuencialmente y
ordenar por seleccin la lista de nmeros en el arreglo, y modificar main.c para usar las mismas.
VecNat.h
#include <stdio.h>
#define TAM 100 // Tamao mximo de arreglos
typedef unsigned int tNat;
typedef struct
{
unsigned int carga; // cantidad de nmeros
tNat n[TAM]; // nmeros cargados en posiciones 0 a carga-1, para carga > 0
} tVecNat; // Tipo para vector de nmeros naturales
/* Carga de vector desde stream de texto.
Dimensin en la primera fila, y hasta 10 valores en columnas de ancho 8 en las siguientes.
El archivo del stream debe estar abierto para lectura. */
void cargarDeST ( tVecNat *v, FILE *arch );
/* Busca secuencialmente un nmero n en v.
Devuelve -1 si n no est en v, o la posicin, en caso contrario. */
int buscarSec ( tNat n, tVecNat *v );
/* Ordena vector por seleccin */
void ordenarSel ( tVecNat *v );
/* Busca secuencialmente un nmero n en v, siendo que v est ordenado.
Devuelve -1 si n no est en v, o la posicin relativa a 0, en caso contrario. */
int buscarSecOrd ( tNat n, tVecNat *v );
/* Imprime los nmeros del vector en un stream de texto.
Los nmeros se organizan en columnas de ancho 8, hasta 10 por lnea.
El archivo del stream debe estar abierto para escribir o agregar. */
void escribeEnST ( FILE *arch, tVecNat *v );

Pgina 2 de 5

Funciones y Recursin
VecNat.c
#include "VecNat.h"
void cargarDeST ( tVecNat *v, FILE *arch )
{
unsigned int i;
fscanf ( arch, "%u", &(v->carga) );
for ( i = 0; i < v->carga; i++ ) fscanf( arch, "%u", &(v->n[i]) );
}
int buscarSec ( tNat n, tVecNat *v )
{
int i;
for ( i = 0; (i < v->carga) && (v->n[i] != n); i++ );
if ( v->n[i] == n ) return i;
else return -1;
}
void ordenarSel ( tVecNat *v )
{
unsigned int i, j, imin;
tNat naux;
for ( i = 0; i < v->carga-1; i++ )
{
/// Bsqueda del menor nmero desde posicin i
imin = i;
for ( j = i+1; j < v->carga; j++ )
if ( v->n[j] < v->n[imin] ) imin = j;
/// Se ubica al nmero mnimo en la posicin i
if ( imin != i )
{
naux = v->n[i];
v->n[i] = v->n[imin];
v->n[imin] = naux;
}
}
}
int buscarSecOrd ( tNat n, tVecNat *v )
{
int i;
for ( i = 0; (i < v->carga) && (v->n[i] < n); i++ );
if ( v->n[i] == n ) return i;
else return -1;
}
void escribeEnST ( FILE *arch, tVecNat *v )

Pgina 3 de 5

Funciones y Recursin
{
unsigned int i, col = 0;
for ( i = 0; i < v->carga; i++ )
{
fprintf ( arch, "%8d", v->n[i] );
col = (col + 1) % 10;
if ( col == 0 ) fprintf(arch, "\n");
}
}
main.c
/** Programa que carga una lista de nmeros naturales en un arreglo desde un archivo
de texto, solicitando el nombre del archivo al usuario, y pide asimismo un nmero a
buscar en la lista.
Luego informa en pantalla la posicin del nmero en la lista o -1 si no est, ordena
los nmeros de menor a mayor, vuelve a informar en pantalla la nueva posicin del
nmero en la lista ordenada, y agrega al archivo original los nmeros ordenados. **/
#include <stdlib.h>
#include "VecNat.h"
int main()
{
char nomarch[13];
tVecNat nums; // Vector de nmeros naturales
FILE *pst; // Puntero a Stream de Texto
tNat num; // Nmero natural a buscar en el vector
int pos; // Posicin del nmero natural en el vector (-1 si no est)
/// Prlogo
printf ("Nombre de archivo con lista de numeros: ");
gets (nomarch);
pst = fopen (nomarch, "rt");
if ( pst == NULL )
{
puts ("No pudo abrirse el archivo...");
system("pause");
return 0;
}
cargarDeST ( &nums, pst );
fclose( pst );
printf ( "\nIngrese numero a buscar: " );
scanf ( "%u", &num );
/// Bsqueda secuencial en lista desordenada
pos = buscarSec( num, &nums );
if ( pos == -1 ) printf ( "\nNo esta." );
else printf ( "\nEsta en la posicion %d de la lista original.", pos+1 );
/// Ordenamiento de la lista de nmeros cargada en el vector
ordenarSel ( &nums );
/// Bsqueda secuencial en lista ordenada
if ( pos != -1 ) printf ( "\n\nEsta en la posicion %d de la lista ordenada.", buscarSecOrd ( num, &nums )+1 );

Pgina 4 de 5

Funciones y Recursin

/// Se agrega la lista ordenada al archivo


pst = fopen (nomarch, "at");
fprintf( pst, "\n\n" );
escribeEnST ( pst, &nums );
fclose ( pst );
/// Eplogo
printf ( "\n\nLa lista de numeros ordenada se agrego al archivo \"%s\".\n\n", nomarch );
system ( "pause" );
return 0;
}
nat1.txt (para probar)
12
7640 5629 19120 3752 12348 2040 31877 22542 21655 16769
25440 21339

Pgina 5 de 5