trójkąt prostokątny rekurencynie

0

siemka, napisałem rekurencyjnie program rysuajacy trojkat prostokątny, pojawia się jednak jakiś błąd logiczny bo zamiast normalnego trójkąta rysuje się taki:

|
\
|
   \
|
      \
|
         \
___________

#include <iostream>

using namespace std;

int rekurencyjny_trojkat(int wysokosc,int podstawa,int r=1){
if(r==1){

    for(int i=wysokosc; i>=1; i--){
        cout<<"|"<<endl;
    for(int j=0; j<=wysokosc-i-1; j++){
        cout<<"   ";
    }
        cout<<"\\"<<endl;
    }
    rekurencyjny_trojkat(wysokosc,podstawa,r+1);
}
else{
        for(int j=0; j<=podstawa; j++)
        cout<<"_";
}

}
int main()
{
rekurencyjny_trojkat(4,10);
return 0;
}


2

Napisz funkcję tak aby wyświetlała jedną linię trójkąta i wywoływała samą siebie. Jedno wywołanie => jedna linia wyświetlona.
Teraz masz funkcję która w jednym wywołaniu (iteracyjnie) wyświetla trójkąt a w drugim podstawę.

A ten "błąd logiczny" to niepotrzebny endl w cout<<"|"<<endl;;

1

Kolejne durne zadanie: weźmy rekurencję i użyjmy ją w jakimś bezsensownym kontekście, żeby zgnębić studenta (żeby nie mógł zrozumieć rekurencji).
Pewnie fan haskell-a uczy C/C++

0

Czy to jest dobre "rekurencyjnie" ?

#include <iostream>

using namespace std;

int rekurencyjny_trojkat(int wysokosc,int podstawa,int r=1){
    if(r==1){

        for(int i=wysokosc; i>=1; i--){
            cout<<"|";
        for(int j=0; j<=wysokosc-i-1; j++){
            cout<<" ";
        }
            cout<<"\\"<<endl;
        }
        rekurencyjny_trojkat(wysokosc,podstawa,r+1);
    }
    else{
            for(int j=0; j<=podstawa; j++)
            cout<<"_";
    }
}
int main()
{
    rekurencyjny_trojkat(6,8);
    return 0;
}

1

Zależy jak zdefiniujesz rekurencję. Czy samo wywołanie funkcji z funkcji jest rekurencją czy też podział na wiele mniejszych zadań?

W zamyśle prowadzącego ta funkcja miała wyglądać tak:

  • narysuj jeden wiersz trójkąta
  • wywołaj siebie aby narysować resztę trójkąta

Czyli podział zadania na n podzadań.

Funkcja:

  • narysuj trójkąt
  • wywołaj siebie aby narysować podstawę

jest podzieleniem na 2 podzadania. Niezależnie od wysokości zawsze będą tylko te dwa kroki.
(To nie jest dobre zadanie do rozwiązywania rekurencyjnego. Nie pokazuje zalet tej "techniki" a tylko utrudnia zrozumienie/napisanie algorytmu.)

0

Ej a tutaj nie jest przypadkiem taka sama technika jakiej ja użyłem w zadaniu? Bo to przyklad podesłany ,z kolei na kwadrat rekurencyjnie ,przez prowadzącego i teraz patrze że w sumie podobnie

#include <iostream>

using namespace std;

void kwadratR(int bok,int r=1){
if(r==1){       //pierwsze wywo�anie
    cout<<'+';
    for(int i=0;i<bok-2;i++)
        cout<<'-';
    cout<<'+'<<endl;
} else {
    cout<<'|';
    for(int i=0;i<bok-2;i++)
        cout<<' ';
    cout<<'|'<<endl;
}
    if(r<=bok) kwadratR(bok,r+1);
if(r==1){       //ostatni powrot
    cout<<'+';
    for(int i=0;i<bok-2;i++)
        cout<<'-';
    cout<<'+'<<endl;;
}
}
int main()
{
    kwadratR(10);
    cout << "Kwadrat!!!" << endl;
    return 0;
}
0

Tutaj wywołanie rekurencyjne funkcji jest poza warunkiem r==1. Wywoła się wielokrotnie aby narysować po jednej linii boku kwadratu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1