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:)
Obserwuj wątek
    • mx-5 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 06.01.06, 22:55
          A może teraz ktoś iteracyjnie bez pętli spróbuje?
          • reaver29 Re: Iteracja a rekurencja 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 Re: Iteracja a rekurencja 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 ;)

Nie masz jeszcze konta? Zarejestruj się

Nie pamiętasz hasła lub ?

Nakarm Pajacyka