Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: piyor6 en 19 Mayo 2018, 22:58 pm



Título: metodo de recursividad
Publicado por: piyor6 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 


Título: Re: metodo de recursividad
Publicado por: MAFUS 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. }


Título: Re: metodo de recursividad
Publicado por: dijsktra 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.