ebooksgratis.com

See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Rekursio – Wikipedia

Rekursio

Wikipedia

Rekursio on matemaattinen keino määritellä funktioita niin, että funktion arvo tietyssä pisteessä riippuu funktion arvosta edellisessä pisteessä. Rekursioyhtälö annetaan yleensä kaksiosaisena: toinen osa määrittelee funktion arvon jollain tunnetulla alkuarvolla (alkuarvoja voi olla myös useita) ja toinen osa muulloin. Esimerkiksi kertoma on helppo määritellä luonnollisille luvuille rekursiivisesti seuraavaan tapaan:


f(n)=\left\{\begin{matrix} 1, & \mbox{jos }n\mbox{ = 0} \\ n \cdot f(n-1) & \mbox{muulloin}   \end{matrix}\right.

Rekursioyhtälöllä tarkoitetaan yhtälöä, jossa annetun funktion arvo voidaan laskea käyttäen hyväksi sen edellisissä pisteissä saamia arvoja. Esimerkkinä rekursioyhtälöstä on Fibonaccin jono

F1 = F2 = 1
Fn = Fn − 2 + Fn − 1 kun n > 2.

Sisällysluettelo

[muokkaa] Rekursio tietotekniikassa/tietojenkäsittelytieteessä

Myös tietotekniikassa käytetään rekursiivisia ohjelmarutiineja. Niissä idea on sama kuin matemaattisesti määritellyissä rekursiivisissa funktioissa, ja rekursiivisesti lasketut välitulokset tallennetaan useimmiten pinoon. Viimeisellä rekursiokierroksella pinosta kerätään vastaukset käänteisessä järjestyksessä. Pseudokoodina kertoma voitaisiin laskea seuraavaan tapaan:

procedure factorial(integer n):
  if n < 2
    return 1
  else
    return n * factorial(n-1)

Yleinen ohjelmointivirhe on niin sanottu ikuinen silmukka, jossa funktiokutsu ei koskaan palaa vaan etenee yhä toistuvasti saman funktion kautta rekursiivisesti kiertäen.

Mikäli ohjelmakoodin rekursiivinen osa on niin sanottu häntärekursio, voidaan rekursio muuttaa tavalliseksi silmukaksi.

Erityisesti Lisp-ohjelmointikielessä rekursion käyttäminen on yleistä.

[muokkaa] Hanoin torni

Hanoin torni -ongelma voidaan ratkaista yksinkertaisella tavalla rekursion avulla. Esimerkki Perl-skriptistä, jolle annetaan parametrina levyjen lukumäärä. Ohjelma palauttaa siirto siirrolta, missä tangossa olevaa levyä on liikuteltava.

#!/usr/bin/perl
#
 
sub hanoi
{
       if($_[0] == 1)
       {
               print "@{[A,B,C]}[$_[1]-1] => @{[A,B,C]}[$_[2]-1]" . "\n";
       }
       elsif($_[0] > 1)
       {
               hanoi($_[0]-1, $_[1], 6-$_[1]-$_[2]);
               hanoi(1, $_[1], $_[2]);
               hanoi($_[0]-1, 6-$_[1]-$_[2], $_[2]);
       }
       else {}
}
 
if($ARGV[0] > 0)
{
       hanoi $ARGV[0], 1, 3;
}

[muokkaa] Labyrintti

Kaksiulotteisen labyrintin polun selvittäminen on yksinkertaista ratkaista rekursiolla. Ajatellaan vaikkapa seuraavaa sokkeloa:


  Alku -> XXXXX..XXX
          .X..X..X..
          .X..X.XXX.
          .X..X.X.X.
          XX..XXX.XX
          X..XX.X..X
          X.....XX.X
          XXXXX.X...
          X..XX.XX..
          XXXX...XXX <- Loppu

Seuraava Perl-skripti ratkaisee polun koordinaatit:

#!/usr/bin/perl
#
 
@laby = (
[1,1,1,1,1,0,0,1,1,1],
[0,1,0,0,1,0,0,1,0,0],
[0,1,0,0,1,0,1,1,1,0],
[0,1,0,0,1,0,1,0,1,0],
[1,1,0,0,1,1,1,0,1,1],
[1,0,0,1,1,0,1,0,0,1],
[1,0,0,0,0,0,1,1,0,1],
[1,1,1,1,1,0,1,0,0,0],
[1,0,0,1,1,0,1,1,0,0],
[1,1,1,1,0,0,0,1,1,1]);
 
@polku = ();
 
sub minotaurus($$)
{
        if($_[0]<0 or $_[0]>9 or $_[1]<0 or $_[1]>9)
        {
                return 0;
        }
        elsif($laby[$_[0]][$_[1]] != 1)
        {
                return 0;
        }
        else
        {
                $laby[$_[0]][$_[1]] = 2;
                if($_[0] == 9 and $_[1] == 9)
                {
                        unshift @polku, "-> ($_[1],$_[0])";
                        return 1;
                }
                if(     minotaurus($_[0]+1, $_[1])
                or      minotaurus($_[0]-1, $_[1])
                or      minotaurus($_[0], $_[1]+1)
                or      minotaurus($_[0], $_[1]-1))
                {
                        unshift @polku, "-> ($_[1],$_[0])";
                        return 1;
                }
                return 0;
        }
}
 
minotaurus 0, 0;
$polku[0] =~ s/^-> // if defined $polku[0];
print "@polku\n";

Ajattaessa tulostuu: (0,0) -> (1,0) -> (2,0) -> (3,0) -> (4,0) -> (4,1) -> (4,2) -> (4,3) -> (4,4) -> (5,4) -> (6,4) -> (6,5) -> (6,6) -> (6,7) -> (6,8) -> (7,8) -> (7,9) -> (8,9) -> (9,9).

[muokkaa] Katso myös


Tämä matematiikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -