Jak zamienić iterację na rekurencję?

Mam zamienić iteracyjną funkcję obliczającą fraktal na rekurencję. Jak to zrobić?
Funkcja (rysująca fraktal) ma postać:

void licz_Wspolrzedne()
{
 wsp[1].x = 1;
 wsp[1].y = 1;
 for (int i = 2; i <= 5000; i++)
    {
     rownanie = losuj_rownanie();
     if (rownanie == 1)
        {
         wsp[i].x = (-0.4)*wsp[i-1].x - 1;
         wsp[i].y = (-0.4)*wsp[i-1].y + 0.1;
        }
     else
        {
         wsp[i].x = (0.76)*wsp[i-1].x - (0.4)*wsp[i-1].y;
         wsp[i].y = (0.4)*wsp[i-1].x + 0.76*wsp[i-1].y;
        }
    }
}

Punkty fraktalu są zapisywane strukturą:

struct wspolrzedne
{
 double x;
 double y;
};

  • Generalnie każdą iterację można przerobić na rekurencję (i w drugą stronę) według schematu:

    iteracja

    x = x_start;
    while(x < x_end)
    {
       costam(x);
       x++;
    }
    

    rekurencja

    void rec(x)
    {
        if(x < x_end)
        {
            costam(x);
            rec(x + 1);
        }
    }
    rec(x_start);
    

    Czasami oczywiście można to zrobić sprytniej.

    Iteracja jest na ogół bardziej wydajna, za to rekurencja nadaje się do automatycznej optymalizacji, zrównoleglania, przekształceń do innej postaci itp.

  • Zakładam, że tablica wsp ma zasięg globalny. Wtedy:

    void licz_wspolrzedne(int i)
    {
     if(i==1)
     {
       wsp[1].x=1;
       wsp[1].y=1;
     }
         rownanie = losuj_rownanie();
         if (rownanie == 1)
            {
             licz_wspolrzedne(i-1);
             wsp[i].x = (-0.4)*wsp[i-1].x - 1;
             wsp[i].y = (-0.4)*wsp[i-1].y + 0.1;
            }
         else
            {
             licz_wspolrzedne(i-1);
             wsp[i].x = (0.76)*wsp[i-1].x - (0.4)*wsp[i-1].y;
             wsp[i].y = (0.4)*wsp[i-1].x + 0.76*wsp[i-1].y;
            }
        }
    }

    Wywołanie funkcji:

    
    ...
    licz_wspolrzedne(k);
    ...
    

Zaloguj się, aby dodać swoją odpowiedź