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++;
}
}
11 Réponses :
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
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 code>.
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 code> et linocount code> - 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.
Exemple dans Python (juste pour le prototypage, mais j'espère que l'idée réussie):
$ python 2717111.py * ** *** **** *****
Je soupçonne que cela serait considéré comme itération.
Bien que valable, cela n'aide pas beaucoup pour Java :)
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);
}
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.
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");
}
-1 L'OP a demandé une méthode récursive (sans itération) b>.
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.
Vous pouvez le faire comme ceci: p>
La méthode obtient le nombre d'étoiles en tant que paramètre. Appelons-le n. P>
alors il: p>
appelle récursivement avec N-1. P> Li>
imprime une ligne avec N STARS. P> LI> ol>
Assurez-vous de ne rien faire si n == 0. P>
Impression d'une ligne avec N STARS implique l'itération Sauf définition de manière récursive séparément.
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: maintenant, utilisez-le pour mettre le reste de la récursion ensemble: p> < Pré> xxx pré> Maintenant, tout ce que vous avez à faire, est l'initier: p>
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.
avis dans votre approche itérative que vous avez deux comptoirs: le premier est de la ligne que vous êtes sur 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: p> ligne code>, et la seconde est la position sur la ligne que vous allez sur x code >. Vous pouvez créer une fonction récursive qui prend deux paramètres et les utilise comme comptoirs imbriqués, y code> et x code>. 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.
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); code>
+1 pour être beaucoup plus élégant que ma solution :) Nice utilisation de la valeur renvoyée.
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);
}
}
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);
}
En fait, c'est en C ++: ")
Vous pouvez utiliser le même concept avec n'importe quelle autre langue;)
Je pense que cela devrait le faire
C'est toujours itératif
#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);
}
Veuillez inclure une description pour coder les réponses
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) code>@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 / ...