2010-04-26 10 views
6

Necesito escribir un método que se llame como printTriangle(5);. Necesitamos crear un método iterativo y un método recursivo (sin CUALQUIER iteración). La salida tiene que tener este aspecto:Crear un triángulo de estrellas utilizando solo recursión

* 
** 
*** 
**** 
***** 

Este código funciona con el iterativa, pero no puedo adaptarlo a ser recursivas.

public void printTriangle (int count) { 
    int line = 1; 
    while(line <= count) { 
     for(int x = 1; x <= line; x++) { 
      System.out.print("*"); 
     } 
     System.out.print("\n"); 
     line++; 
    } 
} 

Debo notar que no puede usar ninguna variable de nivel de clase o ningún método externo.

+8

¿Es esta una tarea? –

+1

Los espacios no son caracteres válidos en los nombres de métodos de Java. Deberá llamarlo 'like_printTriangle (5)' – mob

+0

@DJ. Sí lo es. Esta es la primera vez en 22 capítulos que he tenido algún problema. @mobrule: ¿Qué tiene eso que ver con algo? Una cosa que probé fue el uso de cadenas formateadas, pero parece que Java no admite caracteres de relleno personalizados. –

Respuesta

12

Observe en su enfoque iterativo que tiene dos contadores: el primero es en qué línea se encuentra en line, y el segundo es en qué posición de la línea se encuentra en x. Puede crear una función recursiva que tome dos parámetros y los use como contadores anidados, y y x. Donde disminuyes x hasta que llega a 0, entonces decrementa y establece x = y, hasta que tanto x como y sean 0.

También podrías notar que cada línea sucesiva en el triángulo es la línea anterior más una estrella. Si su función recursiva devuelve una cadena de estrellas para la línea anterior, la siguiente línea es siempre esa cadena más una estrella más. Por lo tanto, el código sería algo así como:

public String printTriangle (int count) { 
    if(count <= 0) return ""; 

    String p = printTriangle(count - 1); 
    p = p + "*"; 
    System.out.println(p); 

    return p; 
} 
+1

wow. No puedo creer que no haya pensado en eso. Creo que fue descartado porque asumí que tiene que volverse vacío porque no tenía sentido devolver nada. ¡Buen trabajo y gracias! También, gran explicación. –

+0

+1 Aquí está la solución correcta ción. ¡Muy inteligente! :-) Una mejora irrelevante: las dos instrucciones de impresión podrían reemplazarse por una sola 'System.out.println (p);' –

+0

agradable. y +1 el prof para una buena pregunta :) –

2

Puede convertir un bucle de una función recursiva de esta manera:

void printStars(int count) { 
    if (count == 0) return; 

    System.out.print("*"); 
    printStars(count - 1); 
} 
printStars(5); //Prints 5 stars 

usted debería ser capaz de hacer una función similar a imprimir líneas.

+1

que imprime 1 línea. la asignación es para un triángulo entero en 1 método. Es por eso que me está confundiendo. –

+6

¿Todavía puede dejar el curso? – WhirlWind

+1

, entonces solo necesita averiguar dónde imprimir el salto de línea –

3

ejemplo en Python (por el simple hecho de la creación de prototipos, pero espero que la idea recibe a través de):

#!/usr/bin/env python 

def printTriangle(n): 
    if n > 1: 
     printTriangle(n - 1) 
    # now that we reached 1, we can start printing out the stars 
    # as we climb out the stack ... 
    print '*' * n 

if __name__ == '__main__': 
    printTriangle(5) 

de salida es el siguiente:

$ python 2717111.py 
* 
** 
*** 
**** 
***** 
+2

Sospecho que eso se consideraría iteración. – SLaks

+0

Aunque es válido, esto no ayuda mucho a java :) –

2

También puede hacerlo con una solo (no tan elegante) la repetición, de la siguiente manera:

public static void printTriangle (int leftInLine, int currLineSize, int leftLinesCount) { 
    if (leftLinesCount == 0) 
     return; 
    if (leftInLine == 0){ //Completed current line? 
     System.out.println(); 
     printTriangle(currLineSize+1, currLineSize+1, leftLinesCount-1); 
    }else{ 
     System.out.print("*"); 
     printTriangle(leftInLine-1,currLineSize,leftLinesCount); 
    } 
} 

public static void printTriangle(int size){ 
    printTriangle(1, 1, size); 
} 

la idea es que el método params representan el co estado de dibujo de mplete.

Tenga en cuenta que el tamaño debe ser mayor que 0.

+0

Por el bien de entender la recursión simple, podría ser más claro utilizar un método de ayuda recursivo para imprimir cada línea. Esto también funciona, sin embargo. :) –

+0

Gracias, esto funciona. Temía que tuviera que recurrir a un método de argumentos múltiples porque mi profesor siempre me dice lo malos que son los métodos de sobrecarga (creo que es bastante útil). Espero que él acepte esto. @Justin tiene que ser un método. Esto es estirarlo pero está lo suficientemente cerca. –

-1

creo que esto debería funcionar ... no probado de la parte superior de la cabeza.

public void printTriangle(int count) 
{  
    if (count == 0) return; 
    printTriangle(count - 1); 
    for (int x = 1; x <= count; x++) { 
     System.out.print("*"); 
    } 
    System.out.print("\n"); 
} 
+0

Esto usa iteración. –

+1

cool logo man. !! –

+0

-1 El OP pidió ** un método recursivo (sin CUALQUIER iteración) **. –

0

Puede hacerlo de esta manera:

El método obtiene el número de estrellas como un parámetro. Vamos a llamarlo n.

Entonces:

  1. hace llamar de forma recursiva con n-1.

  2. imprime una línea con n estrellas.

Asegúrese de no hacer nada si n == 0.

+0

Imprimir una línea con n estrellas implica iteración a menos que se haya definido recursivamente por separado. –

-1

Por lo tanto, es necesario crear un pequeño bloque. ¿Qué información necesita ese bloque? Solo el máximo. Pero la recursión necesita saber en qué línea está ...usted termina con un constructor como:

public void printTriangle (int current, int max) 

Ahora, el uso que poner el resto de la recursividad en conjunto:

public void printTriangle (int current, int max) 
{ 
    if (current <= max) 
    { 
     // Draw the line of stars... 
     for (int x=0; x<current; x++) 
     { 
      System.out.print("*") 
     } 
     // add a newline 
     System.out.print("\n"); 

     // Do it again for the next line, but make it 1-bigger 
     printTriangle(current + 1, max); 
    } 
} 

Ahora, todo lo que tiene que hacer, es iniciarla:

printTriangle(1, 5); 
+0

pero tiene iteración. No necesita ninguna iteración. –

+0

Esto implica iteración. –

+0

Ah ... Perdió esa parte. En ese caso, usted solo necesitaría tener una segunda función iterativa ... aunque la marcada como "respondida" es bastante ingeniosa. – Jerry

0
package playground.tests; 

import junit.framework.TestCase; 

public class PrintTriangleTest extends TestCase { 
    public void testPrintTriangle() throws Exception { 
     assertEquals("*\n**\n***\n****\n*****\n", printTriangleRecursive(5, 0, 0)); 
    } 

    private String printTriangleRecursive(int count, int line, int character) { 
     if (line == count) 
      return ""; 
     if (character > line) 
      return "\n" + printTriangleRecursive(count, line + 1, 0); 
     return "*" + printTriangleRecursive(count, line, character + 1); 
    } 

} 
0
void trianglePrint(int rows){ 
      int static currentRow = 1; 
      int static currentStar = 1; 

      // enter new line in this condition 
      // (star > currentrow) 

      if (currentStar > currentRow){ 
       currentStar = 1; 
       currentRow++; 
       cout << endl; 
      } 

      if (currentRow > rows){ 
       return; // finish 
      } 

      cout << "*"; 
      currentStar++; 

      trianglePrint(rows); 
     } 
+0

en realidad, esto es en C++: ") –

+0

puede utilizar el mismo concepto con cualquier otro idioma;) –

Cuestiones relacionadas