Dodaj do ulubionych

Iteracja a rekurencja

29.12.05, 14:21
Mam zadanie do zrobienia, zrobic ten sam program 2 sposobami: iteracyjnym i
rekurencyjnym. Iteracyjnie juz zrobiłem ale nie za bardzo wiem co to jesr
sposób rekurencyjny?? Program ma rysowac choinke typu:
*
***
*****
*******
Jak to zrobić rekurencją?? Tzn chodzi mi nie o rozwiązanie ale o sposób jak
to ma mniej wiecej wyglądać. Rekurencja to obliczanie kolejnych elementów na
podstawie poprzednich ale jak to odnieśc do tego zadania?? Pzdr, z góry
dzieki:)
Edytor zaawansowany
  • mx-5 29.12.05, 20:14
    Nie da sie tego zrobic( przynajmniej ja nie umiem ) w jednej procedurze
    rekurencyjnie poniewaz wersja iteracyjna zawiera dwie petle: czyli albo dwie
    procedury rekurencyjne, albo procedura rekurencyjna w petli.
    Moje rozwiazanie wyglada tak:

    j:=1;
    rysuj_choinke(1,j); w mainie i ...

    procedure rysuj_choinke( i:integer; var j:integer )
    begin

    while j<=5 do
  • mx-5 29.12.05, 20:18

    Nie da sie tego zrobic( przynajmniej ja nie umiem ) w jednej procedurze
    rekurencyjnie poniewaz wersja iteracyjna zawiera dwie petle: czyli albo dwie
    procedury rekurencyjne, albo procedura rekurencyjna w petli.
    Moje rozwiazanie wyglada tak:

    j:=1;
    rysuj_choinke(1,j); w mainie i ...

    procedure rysuj_choinke( i:integer; var j:integer )
    begin
    while j<=5 do
    begin
    if i<=j then
    begin
    write('*');
    rysuj_choinke(i+1,j);
    break;
    end
    else
    begin
    i:=1;
    writeln;
    j:=1;
    end;
    end;

    Jesli nie lubisz break`a to musisz dorzucic jakas zmiena boolean true/false :)
    Pozdrawiam !
    PS: posiedze nad tym jeszcze bo teraz napisalem pierwsze co mi przyszlo do glowy
    :P I jeszcze podczas pisania dalem zbyt wczesnie enter w wyniku czego sa dwa
    posty ;)
  • spinache 29.12.05, 20:20
    Możesz np. utworzyć funkcję rysującą '*', która w swoim "ciele" wywołuje samą siebie - tak możesz zaimplementować rekurencje.

    pozdrawiam!
  • hydroxyzine 29.12.05, 23:08
    Wersja rekurencyjna może wyglądać np. tak
    :
    #include <stdio.h>
    #include <stdlib.h>

    void rysuj( char *el_choinki ) {
    sprintf( el_choinki, "%s*", el_choinki );
    printf( "%s\n", el_choinki );
    if( *(el_choinki+10) == '*' )
    return;
    else
    rysuj( el_choinki );
    }

    int main ( void ) {
    char *el_choinki = (char *)calloc( 11, sizeof(char) );
    *el_choinki = 0;
    rysuj( el_choinki );
    free( el_choinki );
    return 0;
    }
  • jacu131 05.01.06, 14:16
    Dzieki wam wszystkim za pomoc:) chodziło o to żeby po prostu napisać funkcję
    rysującą która wywołuje sama siebie lub też wywołuje inną funkcje która wywołuje
    ją samą:) i to wszystko. A iteracyjnie rzeczywiscie potrzeba 2 pętle. Dzieki
    jeszcze raz, pozdrawiam!!
  • hydroxyzine 05.01.06, 14:35
    W metodzie iteracyjnej nie potrzeba wcale dwóch pętli. Wystarczy jedna:
    #include <stdio.h>
    #include <stdlib.h>

    int main( void ) {
    int i;
    char *el_choinki = (char *) calloc( 11, sizeof(char) );
    *el_choinki = 0;

    for( i = 0; i <= 10; ++i ) {
    sprintf( el_choinki, "%s*", el_choinki );
    printf( "%s\n", el_choinki );
    }

    free( el_choinki );
    return 0;
    }
  • jacu131 05.01.06, 15:18
    w moim pierwszym poście źle wyswietliło choinke bo bez spacji z przodu powinno
    to być tak(s-spacja):
    sssss*
    ssss***
    sss*****
    ss*******
    s*********
    ***********
    itp
    wiem że mozna prościej ale ja to zrobiłem tak(dev-c++):

    #include <iostream>
    #include <iomanip>
    #include <fstream>

    using namespace std;

    int j, a=39;
    char wysokosc[3];

    void fnRysuj(int wysokosc);
    void fnSprawdz();

    int main()
    {
    fnRysuj(atoi(wysokosc));
    system ("pause");
    return(0);
    }
    /******************************************************************************/
    void fnRysuj(int wysokosc)
    {
    while((wysokosc<3||wysokosc>40)&&(wysokosc[1])
    {
    cout << "Podaj wysokosc choinki (od 3 do 40). Wysokosc = ";
    cin >> ws >> setw(sizeof(wysokosc)) >> wysokosc;
    fnSprawdz();
    cout << "Podales nieprawidlowa wysokosc.\n";
    }
    system("cls");
    ofstream plik("Choinka_iteracyjnie.txt");
    if(!plik)
    {
    cerr << "Nie udalo sie otworzyc pliku do zapisu\n";
    }
    cout <<endl << setw(41) << "&\n";
    plik <<endl << setw(41) << "&\n";
    for(int i=0; i<wysokosc-1; i++)
    {
    static int b=3;
    int c=b;
    while(c)
    {
    if(!j)
    {
    cout << setw(a) << "*";
    plik << setw(a) << "*";
    }
    else
    {
    cout << "*";
    plik << "*";
    }
    c--, j++;
    }
    b+=2, j=0, a--;
    cout <<endl;
    plik <<endl;
    }
    if(wysokosc>10)
    {
    cout << setw(41) << "| |" <<endl << setw(41) << "| |" <<endl <<endl;
    plik << setw(41) << "| |" <<endl << setw(41) << "| |" <<endl <<endl;
    }
    else
    {
    cout << setw(41) << "| |" <<endl <<endl;
    plik << setw(41) << "| |" <<endl <<endl;
    }
    cout << setw(58) << "Merry christmas and happy new year!!!" <<endl <<endl;
    plik << setw(58) << "Merry christmas and happy new year!!!" <<endl <<endl;
    }
    /******************************************************************************/
    void fnSprawdz()
    {
    if (cin.fail())
    {
    cin.clear();

    while(cin.peek()!='\n')
    {
    cin.ignore(1,'\n');
    }}
    }
  • jacu131 05.01.06, 16:58
    to miało byc tak:

    #include <iostream>
    #include <iomanip>
    #include <fstream>

    using namespace std;

    int wysokosc, j, a=39;

    void fnRysuj(int wysokosc);
    void fnSprawdz();

    int main()
    {
    fnRysuj(wysokosc);
    system ("pause");
    return(0);
    }
    /******************************************************************************/
    void fnRysuj(int wysokosc)
    {
    while(wysokosc<3||wysokosc>40)
    {
    cout << "Podaj wysokosc choinki (od 3 do 40). Wysokosc = ";
    cin >> wysokosc;
    fnSprawdz();
    cout << "Podales nieprawidlowa wysokosc.\n";
    }
    system("cls");
    ofstream plik("Choinka_iteracyjnie.txt");
    if(!plik)
    {
    cerr << "Nie udalo sie otworzyc pliku do zapisu\n";
    }
    cout <<endl << setw(41) << "&\n";
    plik <<endl << setw(41) << "&\n";
    for(int i=0; i<wysokosc-1; i++)
    {
    static int b=3;
    int c=b;
    while(c)
    {
    if(!j)
    {
    cout << setw(a) << "*";
    plik << setw(a) << "*";
    }
    else
    {
    cout << "*";
    plik << "*";
    }
    c--, j++;
    }
    b+=2, j=0, a--;
    cout <<endl;
    plik <<endl;
    }
    if(wysokosc>10)
    {
    cout << setw(41) << "| |" <<endl << setw(41) << "| |" <<endl <<endl;
    plik << setw(41) << "| |" <<endl << setw(41) << "| |" <<endl <<endl;
    }
    else
    {
    cout << setw(41) << "| |" <<endl <<endl;
    plik << setw(41) << "| |" <<endl <<endl;
    }
    cout << setw(58) << "Merry christmas and happy new year!!!" <<endl <<endl;
    plik << setw(58) << "Merry christmas and happy new year!!!" <<endl <<endl;
    }
    /******************************************************************************/
    void fnSprawdz()
    {
    if (cin.fail())
    cin.clear();
    while(cin.peek()!='\n')
    cin.ignore(1,'\n');
    }
  • hydroxyzine 06.01.06, 21:59
    No to ze spacjami, metodą iteracyjną, w ANSI C, tylko jedna pętla:
    #include <stdio.h>
    #include <stdlib.h>

    void usage( char **argv ) {
    printf( "\nRysuję choinki o zadanej wysokości.\nUżycie: %s wysokość.\n\n",
    argv[0] );
    exit( 0 );
    }

    int main( int argc, char **argv ) {
    if( argc != 2 ) usage( argv );

    int h = atoi( argv[1] );
    int i;
    int line;
    int chri;
    for (i = 0; i < (2*h-1)*h; i++) {
    line = i/(2*h-1)+1;
    chri = i%(2*h-1)+1;
    if( (chri > h-line) && (chri <= h+line-1) )
    printf( "*" );
    else
    printf( " " );
    if( chri == (2*h-1) ) printf( "\n" );
    }
    }
  • hydroxyzine 06.01.06, 22:55
    A może teraz ktoś iteracyjnie bez pętli spróbuje?
  • reaver29 18.01.06, 15:12
    ? a mozna tak??
    Wydawalo mi sie ze jak jest jakas liczba iteracji to chodzi o petelke? Ale moze
    za zielony jeszcze jestem w tym temacie :|
    pozdrawiam
  • ktosktomafajnegomisiaczka 01.02.06, 17:33
    to byl zart :) aczkolwiek dalo by sie uzywac goto (a fee..) i wtedy de facto
    zadnej petli typu for/do/while nie bedzie ;)

Popularne wątki

Nie pamiętasz hasła

lub ?

 

Nie masz jeszcze konta? Zarejestruj się

Nakarm Pajacyka