Создать треугольник из звезд, используя только рекурсию

мне нужно написать метод, который называется как printTriangle(5);. Нам нужно создать итерационный метод и рекурсивный метод (без какой-либо итерации). Вывод должен выглядеть следующим образом:

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

этот код работает с итеративным, но я не могу адаптировать его к рекурсивному.

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

Я должен отметить, что вы не можете использовать какие-либо переменные уровня класса или какие-либо внешние методы.

9 ответов


обратите внимание в итеративном подходе, что у вас есть два счетчика: первый-какая строка вы находитесь на line, а во-вторых, какая позиция на линии вы находитесь на x. Можно создать рекурсивную функцию, которая принимает два параметра и использует их в качестве вложенных счетчиков, y и x. Где вы декремента х, пока не достигнет 0, то уменьшаем Y и множество X = Y, то пока оба X и y-0.

вы также можете заметить, что каждая последующая линия в треугольнике является предыдущая строка плюс одна звезда. Если рекурсивная функция возвращает строку звезд для предыдущей строки, следующая строка всегда будет этой строкой плюс еще одна звезда. Итак, ваш код будет чем-то вроде:

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

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

    return p;
 }

пример в python (просто ради прототипирования, но я надеюсь, что идея пройдет):

#!/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)

вывод выглядит следующим образом:

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

вы можете преобразовать цикл в рекурсивную функцию следующим образом:

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

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

вы должны иметь возможность сделать аналогичную функцию для печати строк.


вы также можете сделать это с помощью одной (не очень элегантной) рекурсии, а именно:

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

идея заключается в том, что параметры метода представляют полное состояние чертежа.

обратите внимание, что размер должен быть больше 0.


вы можете сделать это так:

метод возвращает число звезд в качестве параметра. Назовем это n.--1-->

затем:

  1. вызывает себя рекурсивно с n-1.

  2. выводит строку с n звездочками.

убедитесь, что ничего не делать, если n == 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);
    }

}

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

Я думаю, это должно сработать... непроверенная на макушке.

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

Итак, вам нужно создать небольшой блок. Какая информация нужна этому блоку? Только максимум. Но рекурсия должна знать, на какой линии она находится... вы в конечном итоге с конструктором типа:

public void printTriangle (int current, int max)

Теперь используйте это, чтобы собрать остальную часть рекурсии вместе:

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

Теперь, все что вам нужно сделать, это инициировать это:

printTriangle(1, 5);