9
votes

Créez un triangle des étoiles en utilisant seulement une récursion

Je dois écrire une méthode appelée comme printtriangle (5); code>. Nous devons créer une méthode itérative et une méthode récursive (sans aucune itération). La sortie doit ressembler à ceci:

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++;
    }
}


6 commentaires

Est-ce une mission de devoirs?


Les espaces ne sont pas des caractères valides dans les noms de méthode Java. Vous devrez appeler cela similaire_printtriangle (5)


@DJ. Oui c'est le cas. C'est la première fois dans 22 chapitres que j'ai eu un problème. @mobrule: Qu'est-ce que cela a à voir avec quoi que ce soit? Une chose que j'ai essayée était d'utiliser une chaîne formatée, mais il semble que Java ne prend pas en charge les caractères de rembourrage personnalisés.


Pourquoi combinerez-vous une boucle de temps et une boucle dans la version itérative? Il semblera beaucoup plus propre (et peut-être être plus facile à convertir en récursivité) avec deux boucles imbriquées).


Je pouvais, mais mon professeur dit qu'il veut une clarté sur la performance (je pense qu'il est juste paresseux).


Voir aussi: stackoverflow.com / Questions / 2498039 / ...


11 Réponses :


3
votes

Vous pouvez convertir une boucle en une fonction récursive comme ceci:

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

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


7 commentaires

qui imprime 1 ligne. L'affectation est pour tout un triangle en 1 méthode. C'est pourquoi cela me confondre.


Ensuite, vous devez juste trouver où imprimer la pause de la ligne


Vous devez faire une fonction récursive séparée qui appelle printstars .


Il n'y a rien de mal à cette méthode particulière. Si nous étions autorisés à utiliser 2 méthodes pour la solution, il n'y aurait aucun problème. Mais nous ne pouvons que les utiliser 1. Avec cela, j'aurais besoin d'une autre méthode qui appelle des caractères d'impression, puis des impressions \ n augmente alors la quantité d'étoiles imprimée pour la ligne suivante - qui n'est pas autorisée.


Je vois; Je n'avais pas compris ça. Vous pouvez faire en sorte que la méthode prend deux paramètres - starcount et linocount - et s'appelle elle-même pour la ligne suivante après la fin de la ligne actuelle.


La question indique que cela doit être appelé comme PrintTtriangle (5) qui règle en quelque sorte avoir 2 paramètres.


Comme l'a affiché Eyal, l'argument / la surcharge de la méthode résout ce problème, mais c'est un peu d'étirement. Nous verrons.



7
votes

Exemple dans Python (juste pour le prototypage, mais j'espère que l'idée réussie):

$ python 2717111.py
*
**
***
****
*****


2 commentaires

Je soupçonne que cela serait considéré comme itération.


Bien que valable, cela n'aide pas beaucoup pour Java :)



2
votes

Vous pouvez également le faire avec une seule récursie (pas si élégante), comme suit:

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);
}


2 commentaires

Par souci de compréhension de la récursion simple, il pourrait être plus clair d'utiliser une méthode d'assistance récursive pour imprimer chaque ligne. Cela fonctionne aussi, cependant. :)


Merci, cela fonctionne. J'avais peur que je puisse devoir faire une méthode d'argumentation multiple parce que mon professeur continue à me dire à quel point les méthodes de surcharge de mauvaise qualité sont (je pense que c'est assez utile). J'espère qu'il accepte cela. @Justin doit être une méthode. Cela l'étire mais il est assez proche.



-1
votes

Je pense que cela devrait fonctionner ... non testé au sommet de ma tête.

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"); 
}


3 commentaires

-1 L'OP a demandé une méthode récursive (sans itération) .


Ya je n'ai pas remarqué la partie "Toute itération" ... Je ne pensais pas non plus que vous pourriez utiliser plus d'une méthode, mais la réponse acceptée a :(


Eh bien, la surcharge de la méthode est aussi proche que je pense que nous allons obtenir.



0
votes

Vous pouvez le faire comme ceci:

La méthode obtient le nombre d'étoiles en tant que paramètre. Appelons-le n.

alors il:

  1. appelle récursivement avec N-1.

  2. imprime une ligne avec N STARS.

    Assurez-vous de ne rien faire si n == 0.


1 commentaires

Impression d'une ligne avec N STARS implique l'itération Sauf définition de manière récursive séparément.



-1
votes

Donc, vous devez créer un petit bloc. Quelles informations cela bloque-t-il? Juste le maximum. Mais la récursivité a besoin de savoir quelle ligne sa ligne ... vous vous retrouvez avec un constructeur comme: xxx

maintenant, utilisez-le pour mettre le reste de la récursion ensemble: < Pré> xxx

Maintenant, tout ce que vous avez à faire, est l'initier: xxx


2 commentaires

Mais il a une itération. Il doit avoir absolument aucune itération.


Ah .. manqua cette partie. Dans ce cas, vous auriez juste besoin d'avoir une deuxième fonction itérative ... bien que celle marquée comme "répondu" soit assez malfiante.



18
votes

avis dans votre approche itérative que vous avez deux comptoirs: le premier est de la ligne que vous êtes sur ligne , et la seconde est la position sur la ligne que vous allez sur x . Vous pouvez créer une fonction récursive qui prend deux paramètres et les utilise comme comptoirs imbriqués, y et x . Lorsque vous décrémentez x jusqu'à ce qu'il atteigne 0, décrémenter y et réglez x = y, jusqu'à ce que les deux x et y sont 0.

Vous pouvez également remarquer que chaque ligne successive dans le triangle est la ligne précédente plus une étoile. Si votre fonction récursive renvoie une chaîne d'étoiles pour la ligne précédente, la ligne suivante est toujours cette chaîne plus une étoile de plus. Donc, votre code serait quelque chose comme: xxx


3 commentaires

Wow. Je ne peux pas croire que je ne pensais pas à ça. Je pense que j'ai été jeté parce que j'ai supposé que cela devait retourner vide parce que cela n'avait pas eu de sens de renvoyer quoi que ce soit. Bon travail et merci! Aussi, grande explication.


+1 Voici la bonne solution. Très intelligent! :-) une amélioration non pertinente: les deux instructions d'impression peuvent être remplacées par un seul system.out.println (p);


+1 pour être beaucoup plus élégant que ma solution :) Nice utilisation de la valeur renvoyée.



0
votes
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 commentaires

0
votes
    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);
        }

2 commentaires

En fait, c'est en C ++: ")


Vous pouvez utiliser le même concept avec n'importe quelle autre langue;)



-1
votes

Je pense que cela devrait le faire xxx


1 commentaires

C'est toujours itératif



0
votes
#include<iostream>
using namespace std;
 void ll__(int x){
  char static c = '0'; // character c will determine when to put newline
  if(!x){
    if(c=='1'){
      cout<<'\n';
    }
    return;
  }
  if(c=='0'){
    ll__(x-1); //  rows to be called in the stack and differentiated by character '0'
  }
  if(x==1 && c=='0'){
   cout<<'*';
  }else{  // columns to be printed in every row as per the row number in the stack
   c = '1';
   ll__(x-1);
   cout<< '*';
  }
}

int main(){
//writes code here
 ll__(5);
 exit(0);
}

1 commentaires

Veuillez inclure une description pour coder les réponses