0% encontró este documento útil (0 votos)
7 vistas27 páginas

Recur

El documento contiene múltiples programas en C que implementan diversas funciones matemáticas y de manipulación de cadenas, incluyendo suma, multiplicación, Fibonacci, conversión a binario, y cálculo del MCD. Cada programa presenta tanto una versión iterativa como recursiva de las funciones, mostrando el uso de memoria dinámica y técnicas de entrada/salida. Además, se incluyen ejemplos de cómo imprimir cadenas sin espacios innecesarios y cómo invertir cadenas de forma recursiva.

Cargado por

macprostuff12
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
7 vistas27 páginas

Recur

El documento contiene múltiples programas en C que implementan diversas funciones matemáticas y de manipulación de cadenas, incluyendo suma, multiplicación, Fibonacci, conversión a binario, y cálculo del MCD. Cada programa presenta tanto una versión iterativa como recursiva de las funciones, mostrando el uso de memoria dinámica y técnicas de entrada/salida. Además, se incluyen ejemplos de cómo imprimir cadenas sin espacios innecesarios y cómo invertir cadenas de forma recursiva.

Cargado por

macprostuff12
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como TXT, PDF, TXT o lee en línea desde Scribd

#include <stdio.

h>
#include <stdlib.h>

int sumasus(int a, int b);

int main ()
{
int n1, n2;

printf("Digite primer num: ");


scanf("%d", &n1);

printf("\nDigite segundo num: ");


scanf("%d", &n2);

int suma = 0;
// 4*3 = 4+4+4;
for(int i=1; i<=n2; i++){
suma += n1;
}

printf("La multiplicacion por sumas sucesivas es: %d", suma);

printf("\n\nFR, La multiplicacion por sumas sucesivas es: %d", sumasus(n1,n2));


printf("\n");
system("PAUSE");
return 0;
}

int sumasus(int a, int b){

if(a==0 || b==0){
return 0;
}

return a + sumasus(a,b-1);
}

#include <stdio.h>
#include <stdlib.h>

int sumarecur(int n1, int n2);

int main ()
{

int n1, n2;

printf("Digite primer num: ");


scanf("%d", &n1);

printf("\nDigite segundo num: ");


scanf("%d", &n2);

int suma = n1 + n2;

printf("\nLa suma de estos dos numeros es: %d", suma);

int sumarrecursi = sumarecur(n1,n2);

printf("\n FR, La suma de estos dos numeros es: %d", sumarrecursi);

printf("\n");
system("PAUSE");
return 0;
}

int sumarecur(int n1, int n2)


{

if(n1==0)
{
return n2;
}
if(n2==0)
{
return n1;
}

return sumarecur(n1-1,n2+1);

}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printinvstr(char *st);

int main(){
char *string;
char c;
int i=0;
printf("Digite la cadena: ");
while((c=getchar())!='\n'){
if(i==0){
string = (char *)malloc(sizeof(char));
}
else {
string = (char *)realloc(string, (i+1)*sizeof(char));
}
*(string+i) = c;
i++;
}
*(string+i)='\0';
printf("\nString digitado: ");
puts(string);

printf("\nString invertido (con for): ");


for(int i=strlen(string)-1; i>=0; i--){
printf("%c", *(string+i));
}
printf("\n");

printf("String invertido (recursivo): ");


printinvstr(string);
printf("\n");

free(string);
system("PAUSE");
return 0;
}

void printinvstr(char *st){


// Caso base: si llegamos al final de la cadena (\0)
if(*st == '\0'){
return;
}

// Llamada recursiva con el siguiente carácter


printinvstr(st + 1);

// Después de la recursión, imprime el carácter actual


printf("%c", *st);
}

#include <stdio.h>
#include <stdlib.h>

int fiborecur(int i);

int main ()
{
int n;
do
{
printf("Introducir la cantidad de num (minimo 20): ");
scanf("%d", &n);

if(n<20)
{
printf("Digite cantidad valida...\n");
system("PAUSE");
system("cls");
}

}
while(n<20);

long *fibo;
fibo = (long *)malloc(n * sizeof(long));

*(fibo + 0) = 1;
*(fibo + 1) = 1;

// Calcular todos los Fibonacci


for(int i=2; i<n; i++)
{
*(fibo + i) = *(fibo + i - 1) + *(fibo + i - 2);
}

// Imprimir todos los calculados


printf("\nTodos los numeros generados:\n");
for(int i=0; i<n; i++)
{
printf("%ld ", *(fibo + i));
}

printf("\n\nPrimeros 15 num de la serie:\n");


for(int i=0; i<15; i++)
{
printf(" %ld", *(fibo + i));
}

printf("\n\nAprox al sig. num (n*1.618):\n");


float aprox;
for(int i=0; i<20; i++)
{
aprox = *(fibo + i) * 1.618;
printf(" %.4f", aprox);
}

printf("\n\nDiferencia entre aproximacion y real:\n");


float dif;
for(int i=0; i<19; i++)
{
aprox = *(fibo + i) * 1.618;
dif = aprox - *(fibo + i + 1);
printf(" %.4f", dif);
}

printf("\n\nSerie Fibonaci RECUR:");


for(int i=1; i<=15; i++) {
printf("%ld ", fiborecur(i));
}

free(fibo);
return 0;
}

int fiborecur(int i)
{

if(i==1 || i==2)
{
return 1;
}
else

return fiborecur(i-1) + fiborecur(i-2);

}
#include <stdio.h>
#include <stdlib.h>

void convertirABinarioRecursivo(int numero) {


if (numero == 0) {
return;
}

convertirABinarioRecursivo(numero / 2);
printf("%d", numero % 2);
}

int main() {
int n;
printf("digite la cantidad de numeros a convertir: ");
scanf("%d", &n);
int *num;
num = (int *)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
printf("Digite num en pos [%d]: ", i);
scanf("%d", (num+i));
}
printf("\n\nConversion de cada numero a binario: \n");
for(int i=0; i<n; i++)
{
printf("Numero %d en binario: ", *(num+i));

// Caso especial para el 0


if(*(num+i) == 0) {
printf("0");
} else {
// Primero contar cuántos bits necesitamos
int temp = *(num+i);
int contador = 0;
while(temp > 0) {
temp = temp / 2;
contador++;
}

// Crear arreglo dinámico del tamaño exacto


int *binario = (int*)malloc(contador * sizeof(int));
int indice = 0;
temp = *(num+i); // Reiniciar temp

while(temp > 0) // Cambié la condición del while


{
binario[indice] = temp % 2; // Guardar el bit
temp = temp / 2; // Dividir para la siguiente iteración
indice++;
}

// Imprimir los bits en orden correcto


for(int j = indice - 1; j >= 0; j--) {
printf("%d", binario[j]);
}

free(binario); // Liberar memoria del arreglo dinámico


}
printf("\n");
}

printf("\n\nRECURS Conversion de cada numero a binario:\n");

for (int i = 0; i < n; i++) {


printf("Numero %d en binario: ", num[i]);

if (num[i] == 0) {
printf("0");
} else {
convertirABinarioRecursivo(num[i]);
}

printf("\n");
}

free(num);
system("PAUSE");
return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int potencia(int b, int e);

int main()
{

int num;
int pot;

printf("Digite un num: ");


scanf("%d", &num);
printf("Digite la potencia a elevar: ");
scanf("%d", &pot);

long long resultado = pow(num,pot);


printf("\n\nResultado con pow: %lld \n\n", resultado);

// 2^4 = 2x2x2x2;

int resul = 1;
for(int i=0; i<pot; i++)
{
resul = resul*num;
}

printf("\n\nResultado con for: %d \n\n", resul);

printf("\n\nResultado con Recursividad: %d \n\n", potencia(num,pot));

system("PAUSE");
return 0;
}

int potencia(int b, int e){

if(e==0){
return 1;
}
if(e==1){
return b;
}

return b * potencia(b, e-1);

#include <stdio.h>
#include <string.h>

// Función recursiva para imprimir texto sin espacios innecesarios


void imprime_texto(char *s) {
if (*s == '\0') return;

if (*s == ' ') {


if (*(s+1) != ' ' && *(s+1) != '\0') {
printf("%c", *s);
}
} else {
printf("%c", *s);
}

imprime_texto(s + 1);
}

int main() {
char texto[100];
int i, espacio_anterior = 1;

printf("Ingrese el texto: ");


gets(texto);

printf("\nTexto original: \"%s\"\n", texto);

// Versión normal (iterativa)


printf("Version normal: \"");
for (i = 0; texto[i] != '\0'; i++) {
if (texto[i] == ' ') {
if (!espacio_anterior) {
printf("%c", texto[i]);
espacio_anterior = 1;
}
} else {
printf("%c", texto[i]);
espacio_anterior = 0;
}
}
printf("\"\n");

// Saltar espacios iniciales para la versión recursiva


i = 0;
while (texto[i] == ' ') i++;

// Versión recursiva
printf("Version recursiva: \"");
imprime_texto(&texto[i]);
printf("\"\n");

return 0;
}
#include <stdio.h>
#include <stdlib.h>

// Versión iterativa
int numbits_iter(int n) {
int count = 0;
while (n != 0) {
// Si el bit menos significativo es 1, incrementar contador
if (n & 1) {
count++;
}
// Desplazar bits hacia la derecha
n = n >> 1; // También se puede escribir como: n = n / 2;
}
return count;
}

// Versión recursiva
int numbits_rec(int n) {
if (n == 0) {
return 0;
}
// Si el bit menos significativo es 1, suma 1, sino suma 0
// Luego llama recursivamente con n desplazado hacia la derecha
return (n & 1) + numbits_rec(n >> 1);
}

int main() {
int n;

printf("Digite un numero entero positivo: ");


scanf("%d", &n);

if (n < 0) {
printf("El numero debe ser positivo.\n");
system("PAUSE");
return 1;
}

printf("\nCantidad de bits en 1 (iterativo): %d\n", numbits_iter(n));


printf("Cantidad de bits en 1 (recursivo): %d\n", numbits_rec(n));

system("PAUSE");
return 0;
}
#include <stdio.h>

// Prototipos
int multiplicacion_normal(int a, int b);
int multiplicacion_rec(int a, int b);

int main() {
int x, y;
printf("Digite el primer numero: ");
scanf("%d", &x);
printf("Digite el segundo numero: ");
scanf("%d", &y);

int normal = multiplicacion_normal(x, y);


int rec = multiplicacion_rec(x, y);

printf("Multiplicacion (funcion normal): %d\n", normal);


printf("Multiplicacion (funcion recursiva): %d\n", rec);

return 0;
}

// Funcion normal (NO recursiva)


int multiplicacion_normal(int a, int b) {
int resultado = 0;
int signo = 1;

if (b < 0) {
b = -b;
signo = -1;
}

for (int i = 0; i < b; i++) {


resultado += a;
}

return signo * resultado;


}

// Funcion recursiva
int multiplicacion_rec(int a, int b) {
if (b == 0)
return 0;
else if (b > 0)
return a + multiplicacion_rec(a, b - 1);
else
return -multiplicacion_rec(a, -b);
}

#include <stdio.h>
#include <stdlib.h>

int mcd(int a, int b);

int main(){

int a;
int b;

printf("Digite a: ");
scanf("%d", &a);
printf("Digite b: ");
scanf("%d", &b);

int temp;
while(b != 0){
temp = b; // Guardar b
b = a % b; // Nuevo b = resto
a = temp; // Nuevo a = valor anterior de b
}

printf("\n\nEl MCD es %d\n", a);

int c;
int d;
printf("\n\nDigite c: ");
scanf("%d", &c);
printf("Digite d: ");
scanf("%d", &d);

printf("\n\nRECUR El MCD entre %d y %d es: %d\n", c, d, mcd(c,d));

system("PAUSE");
return 0;
}

int mcd(int a, int b){

if(b==0){
return a;
}

return mcd(b, a%b);


}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int longcadenarecur(char *);

int main ()
{
char *cadena;
char c;
int i=0;
printf("Digite una cadena: ");

while((c=getchar())!='\n')
{
if(i == 0)
{
cadena = (char *)malloc(sizeof(char));
}
else
{
cadena = (char *)realloc(cadena, i+1*sizeof(char));
}

*(cadena+i) = c;
i++;

}
*(cadena+i)='\0';

puts(cadena);

printf("\n\nstrlen, La longitud del string es: %d", strlen(cadena));

int cont = 0;
for(int i =0; i < *(cadena+i)!='\0'; i++)
{
cont++;
}

printf("\n\nFOR, La longitud del string es: %d", cont);

printf("\n\nrecur, La longitud del string es: %d", longcadenarecur(cadena));

free(cadena);
printf("\n");
system("PAUSE");
return 0;
}

int longcadenarecur(char *cadena){

if(*cadena == '\0') return 0;

return 1 + longcadenarecur(cadena+1);

}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Versión normal
void rev_normal(char *s) {
int len = strlen(s);
char temp;

for (int i = 0; i < len / 2; i++) {


temp = s[i];
s[i] = s[len - 1 - i];
s[len - 1 - i] = temp;
}
}

// Versión recursiva
void rev(char *s) {
int len = strlen(s);

if (len <= 1) {
return;
}

// Intercambiar primer y último carácter


char temp = s[0];
s[0] = s[len - 1];
s[len - 1] = temp;
// Llamar recursivamente con la subcadena del medio
s[len - 1] = '\0'; // Terminar temporalmente la cadena
rev(s + 1); // Llamar con el resto de la cadena
s[len - 1] = temp; // Restaurar el carácter
}

int main() {
char str1[] = "ABRACADABRA";
char str2[] = "ABRACADABRA";

printf("Cadena original: %s\n", str1);

rev_normal(str1);
printf("Invertida (normal): %s\n", str1);

rev(str2);
printf("Invertida (recursivo): %s\n", str2);

system("PAUSE");
return 0;
}

#include <stdio.h>
#include <stdlib.h>
int fact(int n);

int main ()
{

int n;
printf("Digite un numero: ");
scanf("%d", &n);

if(n==1)
{
printf("\n\nEl factorial de %d!, es: 1", n);
}

if(n==0)
{
printf("\n\nEl factorial de %d!, es: 1", n);
}

int factorial = 1;
int i = n;
while(i > 1)
{

factorial = factorial * i;
i--;

printf("\n\nEl factorial de %d!, es: %d ", n, factorial);

int factfuncionrecur = fact(n);

printf("\n\nFR, El factorial de %d!, es: %d ", n, factfuncionrecur);

printf("\n");
system("PAUSE");
return 0;
}

int fact(int n)
{
if(n==1){
return 1;
}
if(n==0){
return 1;
}

return n * fact(n-1);

}
#include <stdio.h>
#include <stdlib.h>

// Versión normal (iterativa)


void convertir_normal(int num, int base) {
if (num == 0) {
printf("0");
return;
}

int digitos[100];
int i = 0;

while (num > 0) {


int resto = num % base;
if (resto < 10) {
digitos[i] = resto + '0'; // Dígitos 0-9
} else {
digitos[i] = resto - 10 + 'A'; // Letras A-F para bases > 10
}
num = num / base;
i++;
}

// Imprimir en orden inverso


for (int j = i - 1; j >= 0; j--) {
printf("%c", digitos[j]);
}
}

// Versión recursiva
void convertir(int num, int base) {
// Caso base: si el número es 0, no hacer nada
if (num == 0) {
return;
}

// Llamada recursiva con el cociente


convertir(num / base, base);

// Imprimir el resto después de la recursión


int resto = num % base;
if (resto < 10) {
printf("%d", resto);
} else {
printf("%c", resto - 10 + 'A'); // Para bases > 10 (hexadecimal)
}
}

// Función auxiliar para manejar el caso especial del 0


void convertir_completo(int num, int base) {
if (num == 0) {
printf("0");
} else {
convertir(num, base);
}
}

int main() {
int numero, base;

printf("Digite el numero a convertir: ");


scanf("%d", &numero);

do {
printf("Digite la base (2-16): ");
scanf("%d", &base);

if (base < 2 || base > 16) {


printf("Error: La base debe estar entre 2 y 16\n");
}
} while (base < 2 || base > 16);

printf("\nNumero %d en base %d:\n", numero, base);

printf("Conversion (normal): ");


convertir_normal(numero, base);
printf("\n");

printf("Conversion (recursivo): ");


convertir_completo(numero, base);
printf("\n");

// Ejemplo del ejercicio: 317 en base 3


printf("\nEjemplo del ejercicio (317 en base 3): ");
convertir_completo(317, 3);
printf("\n");

system("PAUSE");
return 0;
}
#include <stdio.h>

// Prototipos
int cont_pal_normal(char *s);
int cont_pal(char *s);

int main() {
char texto[100];
printf("Digite un texto: ");
gets(texto);

int normal = cont_pal_normal(texto);


int rec = cont_pal(texto);

printf("Cantidad de palabras (funcion normal): %d\n", normal);


printf("Cantidad de palabras (funcion recursiva): %d\n", rec);

return 0;
}

// Funcion normal (NO recursiva)


int cont_pal_normal(char *s) {
int palabras = 0;
int i = 0;
int en_palabra = 0;

while (s[i] != '\0') {


if (s[i] != ' ' && en_palabra == 0) {
en_palabra = 1;
palabras++;
} else if (s[i] == ' ') {
en_palabra = 0;
}
i++;
}
return palabras;
}

// Funcion recursiva
int cont_pal(char *s) {
// Saltar espacios iniciales
while (*s == ' ')
s++;

if (*s == '\0')
return 0;

// Avanzar hasta el próximo espacio o final de cadena


while (*s != ' ' && *s != '\0')
s++;

return 1 + cont_pal(s);
}
#include <stdio.h>
#include <stdlib.h>

// Versión normal
int cdig_normal(int n)
{
if (n == 0)
{
return 1;
}

int contador = 0;
if (n < 0)
{
n = -n; // Hacer positivo
}

while (n > 0)
{
contador++;
n = n / 10;
}

return contador;
}

// Versión recursiva
int cdig(int n)
{
// Caso especial para 0
if (n == 0)
{
return 1;
}

// Hacer positivo si es negativo


if (n < 0)
{
n = -n;
}

// Caso base: si n < 10, tiene 1 dígito


if (n < 10)
{
return 1;
}

// Caso recursivo: 1 + dígitos del número sin el último dígito


return 1 + cdig(n / 10);
}

int main()
{
int numero;

printf("Digite un numero: ");


scanf("%d", &numero);

printf("\nNumero: %d\n", numero);


printf("Digitos (normal): %d\n", cdig_normal(numero));
printf("Digitos (recursivo): %d\n", cdig(numero));

system("PAUSE");
return 0;
}

#include <stdio.h>

// Prototipos
int cantidad_caracter_normal(char *s);
int cantidad_caracter_rec(char *s);
int main() {
char texto[100];
printf("Digite un texto: ");
gets(texto);

int normal = cantidad_caracter_normal(texto);


int rec = cantidad_caracter_rec(texto);

printf("Cantidad de caracteres (funcion normal): %d\n", normal);


printf("Cantidad de caracteres (funcion recursiva): %d\n", rec);

return 0;
}

// Funcion normal (NO recursiva)


int cantidad_caracter_normal(char *s) {
int contador = 0;
while (s[contador] != '\0') {
contador++;
}
return contador;
}

// Funcion recursiva
int cantidad_caracter_rec(char *s) {
if (*s == '\0')
return 0;
else
return 1 + cantidad_caracter_rec(s + 1);
}

#include <stdio.h>

// Prototipos
int cant_digit_normal(int num);
int cant_digit_rec(int num);
int main() {
int n;
printf("Digite un numero: ");
scanf("%d", &n);

int normal = cant_digit_normal(n);


int rec = cant_digit_rec(n);

printf("Cantidad de digitos (funcion normal): %d\n", normal);


printf("Cantidad de digitos (funcion recursiva): %d\n", rec);

return 0;
}

// Funcion normal (NO recursiva)


int cant_digit_normal(int num) {
if (num < 0)
num = -num;

int contador = 0;
do {
contador++;
num = num / 10;
} while (num != 0);
return contador;
}

// Funcion recursiva
int cant_digit_rec(int num) {
if (num < 0)
num = -num;

if (num < 10)


return 1;
else
return 1 + cant_digit_rec(num / 10);
}

También podría gustarte