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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


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

Desconectado Desconectado

Mensajes: 15


Ver Perfil
metodo de recursividad
« en: 19 Mayo 2018, 22:58 pm »

buenaas tardes a todos amigos hoy vengo con una duda que tengo en un ejercicio que me pusieron en la universidad y trata de hacer una figura gemotrica con asteriscos(*) un rombo para ser mas exacto y hasta donde yo se una funcion recursiva es una funcion que se llama a si misma, ya hice un ejercicio de sacar la serie fibonacci con recursividad y lo hice pero este no lo entiendo y no he sido capaz.
yo hice un codigo que hace lo que necesito pero sin recurisividad para que ustedes vean que es exactamente que es lo que necesito con gusto pueden copilar el codigo que funciona a la perfecion
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main(){
  5.    int n,i,j;
  6. printf("FIGURA GEOMETRICA\n");
  7. printf("ingrese el la altura: ");
  8. scanf("%d",&n);
  9. for(i=1;n-1>=i;i++){
  10. for(j=n;j>=i;j--){
  11.  
  12.    printf(" ");
  13. }
  14. for(int k=1;2*i-1>=k;k++){
  15.  
  16.  printf("*");
  17. }
  18. printf("\n");
  19. }
  20. for(i=1;n>=i;i++){
  21.    for(j=1;j<=i;j++){
  22.        printf(" ");
  23.    }
  24. for(int k=2*n-1;2*i-1<=k;k--){
  25.  
  26.  printf("*");
  27. }
  28. printf("\n");
  29. }
  30.  
  31.  
  32.  
  33.  
  34.    return 0;
  35. }
  36.  
  37.  
  38.  

necesito exactamente eso pero en recursividad muchas gracias espero respondan rapido 


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: metodo de recursividad
« Respuesta #1 en: 20 Mayo 2018, 18:58 pm »

Para que te funcione de forma recursiva se debe guardar el estado de unas cuantas cosas, podrías pasarlas por los argumentos pero eso implicaría complicar la firma de tu función de forma innecesaria, ya que C dispone de herramientas para eso: las variables estáticas.

Esta podría ser una solución elegante
Código
  1. #include <stdio.h>
  2.  
  3. void rombo(unsigned altura) {
  4.    static unsigned h; // Height, altura
  5.    static unsigned w; // Width, ancho
  6.    static unsigned i; // Iteration, el escalon actual
  7.  
  8.    if(altura) {
  9.        if(altura%2 == 0) // Para que quede bien cuadrado
  10.            ++altura;     // altura debe ser impar
  11.        h = altura;
  12.        w = 1;
  13.        i = 0;
  14.    }
  15.  
  16.    if(i<h) { // Mientras el reglón no ha llegado a la altura del rombo
  17.        int j;
  18.        for(j=0; j<=h/2-w/2; ++j) // Calculo los espacios por escalon
  19.            putchar(' ');         //    y los imprimo
  20.        for(j=0; j<w; ++j) // Imprimo
  21.            putchar('*');  //    los asteriscos
  22.        putchar('\n'); // Al siguiente reglón
  23.        if(i<h/2) w += 2; // Calculo los asteriscos que
  24.        else w -= 2;      //    habrá en el siguiente reglon
  25.        ++i; // Voy al siguiente reglón
  26.        rombo(0); // Llamo de nuevo a rombo indicando que siga con los datos que hay (0)
  27.    }
  28. }
  29.  
  30. int main() {
  31.    rombo(6);
  32. }


En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: metodo de recursividad
« Respuesta #2 en: 27 Junio 2018, 16:27 pm »

Esta podría ser una solución elegante
Código
  1. #include <stdio.h>
  2.  
  3. void rombo(unsigned altura) {
  4. ...
  5.    if(i<h) { // Mientras el reglón no ha llegado a la altura del rombo
  6.        int j;
  7.        for(j=0; j<=h/2-w/2; ++j) // Calculo los espacios por escalon
  8.            putchar(' ');         //    y los imprimo
  9.        for(j=0; j<w; ++j) // Imprimo
  10.            putchar('*');  //    los asteriscos
  11.        putchar('\n'); // Al siguiente reglón
  12. ...}
  13.  
  14. int main() {
  15.    rombo(6);
  16. }

hmmm... por lo general, si se meten bucles, se pierde la recursividad (caso base, caso recursivo, funcion de avance...

Mi propuesta

Código:
height: 0
*
height: 2
 *
***
 *
height: 4
  * 
 ***
*****
 ***
  * 
height: 6
   *   
  *** 
 *****
*******
 *****
  *** 
   *   
height: 8
    *   
   ***   
  ***** 
 *******
*********
 *******
  ***** 
   ***   
    *   
height: 10
     *     
    ***   
   *****   
  ******* 
 *********
***********
 *********
  ******* 
   *****   
    ***   
     *     
height: 12
      *     
     ***     
    *****   
   *******   
  ********* 
 ***********
*************
 ***********
  ********* 
   *******   
    *****   
     ***     
      *     
height: 14
       *       
      ***     
     *****     
    *******   
   *********   
  *********** 
 *************
***************
 *************
  *********** 
   *********   
    *******   
     *****     
      ***     
       *       
height: 16
        *       
       ***       
      *****     
     *******     
    *********   
   ***********   
  ************* 
 ***************
*****************
 ***************
  ************* 
   ***********   
    *********   
     *******     
      *****     
       ***       
        *       
height: 18
         *         
        ***       
       *****       
      *******     
     *********     
    ***********   
   *************   
  *************** 
 *****************
*******************
 *****************
  *************** 
   *************   
    ***********   
     *********     
      *******     
       *****       
        ***       
         *         
height: 20
          *         
         ***         
        *****       
       *******       
      *********     
     ***********     
    *************   
   ***************   
  ***************** 
 *******************
*********************
 *******************
  ***************** 
   ***************   
    *************   
     ***********     
      *********     
       *******       
        *****       
         ***         
          *         
height: 22
           *           
          ***         
         *****         
        *******       
       *********       
      ***********     
     *************     
    ***************   
   *****************   
  ******************* 
 *********************
***********************
 *********************
  ******************* 
   *****************   
    ***************   
     *************     
      ***********     
       *********       
        *******       
         *****         
          ***         
           *           
height: 24
            *           
           ***           
          *****         
         *******         
        *********       
       ***********       
      *************     
     ***************     
    *****************   
   *******************   
  ********************* 
 ***********************
*************************
 ***********************
  ********************* 
   *******************   
    *****************   
     ***************     
      *************     
       ***********       
        *********       
         *******         
          *****         
           ***           
            *         






Código
  1. #include <stdio.h>
  2.  
  3. void printLineR(const int N, const int n,const int start)
  4. {
  5.  if (start==N+1) return;
  6.  else
  7.    {
  8.      const int nn = n<=(N/2)?n:N-n;
  9.      if (start < (N/2) - nn ) printf(" ");
  10.      if ((((N/2) - nn)<=start) && (start <= (N/2 + nn))) printf("*");
  11.      if ((start > (N/2 + nn))) printf(" ");
  12.      printLineR(N,n<=(N/2)?n:N-n,start+1);
  13.    }
  14. }
  15.  
  16. void printLine(const int N,const int n)
  17. {
  18.  printLineR(N,n,0);
  19.  printf("\n");
  20. }
  21.  
  22.  
  23. void diamondR(const int N, const int n)
  24. {
  25.  if (n == N+1)  return;
  26.  else
  27.    {
  28.      printLine(N,n);
  29.      diamondR(N,n+1);
  30.    }
  31.  
  32. }
  33. /* 0 <= N */
  34. void diamond(const int N)
  35. {
  36.  diamondR(N,0);
  37. }
  38.  
  39. int main()
  40. {
  41.  int N=25;
  42.  for (int n=0; n<N ; n+=2 )
  43.    {
  44.      printf("height: %d\n",n);
  45.      diamond(n);
  46.    }
  47. }
  48.  
  49.  
  50.  
En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Recursividad
Java
rjrn 8 10,125 Último mensaje 17 Marzo 2009, 19:33 pm
por weirdtyping
[Python] invocar metodo desde metodo.
Python
Hesp 2 7,425 Último mensaje 8 Marzo 2009, 00:38 am
por Hesp
recursividad
Ejercicios
Choclito 0 3,744 Último mensaje 12 Mayo 2009, 04:47 am
por Choclito
(JS y PHP) no puedo ejecutar metodo de clase JS atraves de metodo de clase PHP
PHP
noob2012 2 3,714 Último mensaje 7 Enero 2017, 22:27 pm
por noob2012
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines