elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Numero menor recursivo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Numero menor recursivo  (Leído 13,793 veces)
sora_ori

Desconectado Desconectado

Mensajes: 269



Ver Perfil
Numero menor recursivo
« en: 13 Abril 2015, 21:11 pm »

Hola compañeros, estoy haciendo un programa recursivo en C que mostrará el número menor de un vector.

De momento esto es lo que he planteado:

Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3.  
  4. /* Programa recursivo que muestra el numero menor de un vector */
  5.  
  6. int valorMenor(int vector[100], int medida);
  7.  
  8. int main(){
  9.    int medida, i, valor;
  10.    int vector[100];
  11.  
  12.    printf("Cuantos numeros quieres introducir? "); // Creo que esto no se tiene que poner, hay que rellenar el vector sin pedir el tamaño pero estoy dudando
  13.    scanf("%i", &medida);
  14.  
  15.    for(i=0; i<medida; i++){ // Rellenamos el vector
  16.             printf("Valor %i: ", i+1);
  17.             scanf("%i", &valor);
  18.             vector[i] = valor;
  19.    }
  20.  
  21.    printf("El valor mas pequeno es: %i", valorMenor(vector, medida));
  22.  
  23.  
  24.    getch();
  25.    return 0;
  26. }
  27.  
  28. int valorMenor(int vector[100], int medida){
  29.    int menor=0;
  30.  
  31.    // Caso base
  32.    if (medida==0){
  33.              if (menor > vector[100]){
  34.                        return vector[100];
  35.                        }
  36.              else{
  37.                   return menor;
  38.                   }
  39.              }
  40.  
  41.              else{
  42.              if (menor > vector[100]){
  43.                        return valorMenor (vector[100], medida-1, menor);
  44.                        }
  45.                        else{
  46.                             return valorMenor (vector, medida-1, menor);
  47.                        }
  48.              }
  49. } // Fin función
  50.  

Un saludo


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Numero menor recursivo
« Respuesta #1 en: 13 Abril 2015, 21:34 pm »

En primer lugar, no puedes acceder a vector[ 100 ]. El máximo es 99.

En segundo lugar, ¿qué es medida? ¿El tamaño del vector? De ser así... ¿Por qué accedes a vector[ 99 ] en la segunda parte del código?

Y otra es, que a la función le tendrás que pasar "vector", no "vector[ 100 ]".


En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Numero menor recursivo
« Respuesta #2 en: 14 Abril 2015, 02:37 am »

Calcular el menor número de un array(desorganizado) tiene una complejidad temporal de O(n), donde n es el tamaño de la entrada, pues tienes que recorrer el array completo para saber cual es el menor. Haciéndolo recursivo no tendrá menor complejidad temporal, será igual.

Aquí te dejo el código en C# de como lo puedes hacer.

Código
  1. static int Minimo(int[] numeros, int minimoInf, int minimoSup)
  2.        {
  3.            if (minimoInf == minimoSup)
  4.                return numeros[minimoSup];
  5.            if (numeros[minimoInf] > numeros[minimoSup])
  6.                return Minimo(numeros, minimoInf + 1, minimoSup);
  7.            else return Minimo(numeros, minimoInf, minimoSup - 1);
  8.        }
  9.  

La sintaxis de C# es bastante parecida a C, así que dudo que tengas algún problema en entender, de igual manera si lo tienes dilo.

Ahora, a la hora de llamar el método, el parametro int minimoInf debe ser igual a 0, y int minimoSup debe ser igual a la longitud del array - 1 (recuerda que si un array tiene 100 elementos, el último índice accesible es el 99)

Salu2s, espero poder haberte ayudado
En línea

sora_ori

Desconectado Desconectado

Mensajes: 269



Ver Perfil
Re: Numero menor recursivo
« Respuesta #3 en: 15 Abril 2015, 00:15 am »

Hola compañeros, ya tengo mejorado el código. Lo que pretendia hacer con la variable "medida" era saber los elementos que habrán en el vector.

Ahora lo verán más claro:

Código
  1. #include<stdio.h>
  2. #include<conio.h>
  3.  
  4. /* Programa recursivo que muestra el numero menor de un vector */
  5.  
  6. int valorMenor(int* vector, int num_elementos, int menor_encontrado);
  7.  
  8. int main(){
  9.    int i, valor;
  10.    int vector[100];
  11.    int num_elementos;
  12.    int menor_encontrado;
  13.  
  14.    printf("Cuantos numeros quieres introducir? "); // Creo que esto no se tiene que poner, hay que rellenar el vector sin pedir el tamaño pero estoy dudando
  15.    scanf("%i", &num_elementos);
  16.  
  17.    for(i=0; i<num_elementos; i++){ // Rellenamos el vector
  18.             printf("Valor %i: ", i+1);
  19.             scanf("%i", &valor);
  20.             vector[i] = valor;
  21.    }
  22.  
  23.    printf("El valor mas pequeno es: %i", valorMenor(vector, num_elementos, menor_encontrado));
  24.  
  25.  
  26.    getch();
  27.    return 0;
  28. }
  29.  
  30. int valorMenor(int* vector, int num_elementos, int menor_encontrado){
  31.  
  32. // Caso base
  33. if (num_elementos == 0)
  34. return menor_encontrado;
  35.    else
  36.     return valorMenor(vector, num_elementos -1, min(menor_encontrado, vector[num_elementos -1]));
  37.  
  38. } // Fin función
  39.  

Gracias por la ayuda!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Numero menor recursivo
« Respuesta #4 en: 16 Abril 2015, 17:10 pm »

ya tengo mejorado el código. Lo que pretendia hacer con la variable "medida" era saber los elementos que habrán en el vector.
Lo primero que debes hacer es evitar el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|. Si lo haces porque utilizas Dev-C++ y este no incluye la característica de pausa automática cambiate a cualquier otro IDE, el mas parecido es Orwell Dev-C++.

En el programa utilizas la función "min" la cual es una extensión, otro problema es no darle un valor inicial a la variable "menor_encontrado" con ello este es no definido o "basura".

Por ultimo la función no necesita de tres argumentos, con solo dos basta:
Código
  1. int valorMenor(int *v, int n)
  2. {
  3.   return n == 1 ? v[0] : min(v[0], valorMenor(v + 1, n - 1));
  4. }

Otra opción es utilizar una variable auxiliar, con ello se evita el uso de la función "min":
Código
  1. int valorMenor(int a[], int n)
  2. {
  3.   int r;
  4.  
  5.   return n == 1 || a[0] < (r = valorMenor(a + 1, n - 1)) ? a[0] : r;
  6. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Blaster

Desconectado Desconectado

Mensajes: 190


Ver Perfil
Re: Numero menor recursivo
« Respuesta #5 en: 21 Abril 2015, 02:37 am »

Por ultimo la función no necesita de tres argumentos, con solo dos basta:

rir3760 porque sacrificar rendimiento y velocidad por únicamente ahorrarte un parámetro mas, lo digo porque esta linea

Código
  1. min(a[0], valormenor(a + 1, n - 1));

Se convierte en

Código
  1. (a[0] < valormenor(a + 1, n - 1))?(a[0]):(valormenor(a + 1, n - 1));

Como se puede ver , valormenor se llama dos veces, esas dos llamadas hacen cuatro llamadas que a su ves estas realizan otras ocho llamadas y así sucesivamente, por lo esto tendrá una directa incidencia en la velocidad de la función, esto puede notarse si el array es de una tamaño mayor

Un saludo

 
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Numero menor recursivo
« Respuesta #6 en: 21 Abril 2015, 03:39 am »

rir3760 porque sacrificar rendimiento y velocidad por únicamente ahorrarte un parámetro mas
Cierto si se trata de una macro. Yo asumo (por sentido común, nada mas) que es una función y en ese caso no hay problema pero seria mejor que el OP (me refiero a sora_ori ) nos indicara que es esa bendita extensión.

En el caso de que exista una macro con ese nombre como bien comentas se presentarían problemas como las llamadas múltiples, en ese escenario basta con colocar "min" entre paréntesis para así evitar la macro y terminar con una llamada a función.

Pero, de nuevo, considerar a "min" como una función solo fue una educated guess.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ordenar número de mayor a menor « 1 2 »
Programación Visual Basic
Nessito 14 17,022 Último mensaje 19 Mayo 2007, 20:09 pm
por Nessito
[Python] Programita de Numero mayor y menor
Python
~ Ghost_Networks ~ 1 52,744 Último mensaje 8 Diciembre 2010, 18:39 pm
por ChicoMaravilla
El numero sobre pasa el rango menor solicitado
Java
Antoniio 2 2,013 Último mensaje 28 Enero 2016, 16:10 pm
por Antoniio
Numero mayor y numero menor!!!! (error)
Java
CharlyScoTT 2 4,273 Último mensaje 21 Octubre 2017, 19:46 pm
por engel lex
[C++] Determinar el menor numero de billetas y monedas.
Programación C/C++
djpacheco3 5 4,782 Último mensaje 4 Septiembre 2019, 02:12 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines