41

Programmeerimine - ut...Programmeerimine 14. loeng T ana loengus Rekursiooni m ~oiste Rekursiooni baas ja samm Rekursiivsete funktsioonide n aiteid Rekursioon Rekursioonon funktsioonide

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

  • Programmeerimine

    14. loeng

  • Tana loengusRekursiooni m~oiste

    Rekursiooni baas ja samm

    Rekursiivsete funktsioonide naiteid

  • Rekursioon

    Rekursioon on funktsioonide de�neerimise meetod, kus de�-neeritav funktsioon kutsub valja iseennast.

    Sarnaselt iteratsioonile (so. tsuklidirektiividele) v~oimaldabrekursioon kirjeldada korduvtaidetavaid protsesse.

    Uldjuhul on rekursioon v~oimsam kui iteratsioon.

    { Tsuklidirektiive saab modelleerida rekursiivsete funktsioonide-na.

    { Rekursiooni saab modelleerida tsuklidirektiividega uldjuhulainult magasini (ehk pinu) abil.

    Rekursiooni kasutatakse laialdaselt programmeerimises, arvu-titeaduses, matemaatikas, aga ka naiteks keeleteaduses, muusikas,kunstis, . . .

    3 / 17

  • Rekursioon pildis

    Allikad:http://www.shutterstock.com/s/recursion/search.html

    http://www.mi.sanu.ac.rs/vismath/bridges2005/burns/

    index.html4 / 17

    http://www.shutterstock.com/s/recursion/search.htmlhttp://www.mi.sanu.ac.rs/vismath/bridges2005/burns/index.htmlhttp://www.mi.sanu.ac.rs/vismath/bridges2005/burns/index.html

  • Faktoriaal

    Naturaalarvu n faktoriaal (tahistus n!) on n esimesepositiivse taisarvu korrutis.

    n! =nY

    i=1

    i = n � (n� 1) � : : : � 3 � 2 � 1

    On kokku lepitud, et 0! = 1.

    Iteratiivne faktoriaal

    def factorial (n):f = 1for i in range(1,n+1):

    f �= ireturn f

    5 / 17

  • Faktoriaal

    Paneme tahele, et

    (n+ 1)! = (n+ 1) � n � (n� 1) � : : : � 3 � 2 � 1= (n+ 1) � n!

    Seega saame rekursiivse de�nitsiooni

    n! =

    (1; kui n = 0n � (n� 1)!; kui n > 0

    Rekursiivne faktoriaal

    def factorial (n):if n == 0:

    return 1else:

    return n � factorial (n�1)

    6 / 17

  • Faktoriaal

    factorial(5)

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    6

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    6

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    6

    24

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    6

    24

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    6

    24

    120

    7 / 17

  • Faktoriaal

    factorial(5)

    5 * factorial(4)

    4 * factorial(3)

    3 * factorial(2)

    2 * factorial(1)

    1 * factorial(0)

    1

    1

    2

    6

    24

    120

    7 / 17

  • Rekursioon

    Astendamine iteratiivselt

    def power(n, m):p = 1for i in range(m):

    p �= nreturn p

    Astendamine rekursiivselt

    def power(n, m):if m == 0:

    return 1else:

    return n � power(n, m�1)

    8 / 17

  • Rekursioon

    Astendamine iteratiivselt

    def power(n, m):p = 1for i in range(m):

    p �= nreturn p

    Astendamine rekursiivselt

    def power(n, m):if m == 0:

    return 1else:

    return n � power(n, m�1)

    8 / 17

  • Rekursioon

    Listi pikkus iteratiivselt

    def pikkus(xLst):i = 0for c in xLst:

    i += 1return i

    Listi pikkus rekursiivselt

    def pikkus(xLst):if xLst == []:

    return 0else:

    return 1 + pikkus(xLst[1:])

    9 / 17

  • Rekursioon

    Listi pikkus iteratiivselt

    def pikkus(xLst):i = 0for c in xLst:

    i += 1return i

    Listi pikkus rekursiivselt

    def pikkus(xLst):if xLst == []:

    return 0else:

    return 1 + pikkus(xLst[1:])

    9 / 17

  • Rekursioon

    Palindroomid

    def palindrome(s):if len(s)

  • Rekursiooni baas ja samm

    Et rekursioon termineeruks, peab rekursiivse funktsiooni ke-has toimuma hargnemine s~oltuvalt funktsiooni argumentidest.

    Vahemalt uks haru peab olema ilma rekursiivse valjakutseta(nn. rekursiooni baas).

    Rekursiivsed valjakutsed peavad olema "vaiksematel" argu-mentidel.

    Naiteid mittetermineeruvast rekursioonist

    def factorial (n):return n � factorial (n�1) # Rekursiooni baas puudu!

    11 / 17

  • Rekursiooni baas ja samm

    Et rekursioon termineeruks, peab rekursiivse funktsiooni ke-has toimuma hargnemine s~oltuvalt funktsiooni argumentidest.

    Vahemalt uks haru peab olema ilma rekursiivse valjakutseta(nn. rekursiooni baas).

    Rekursiivsed valjakutsed peavad olema "vaiksematel" argu-mentidel.

    Naiteid mittetermineeruvast rekursioonist

    def factorial (n):return n � factorial (n�1) # Rekursiooni baas puudu!

    11 / 17

  • Rekursiooni baas ja samm

    Et rekursioon termineeruks, peab rekursiivse funktsiooni ke-has toimuma hargnemine s~oltuvalt funktsiooni argumentidest.

    Vahemalt uks haru peab olema ilma rekursiivse valjakutseta(nn. rekursiooni baas).

    Rekursiivsed valjakutsed peavad olema "vaiksematel" argu-mentidel.

    Naiteid mittetermineeruvast rekursioonist

    def countUp(n):if n

  • Rekursiooni baas ja samm

    Naiteid termineeruvast rekursioonist

    def foo(n):if n >= 20:

    return �1else:

    return 2�n + foo(n+4)

    12 / 17

  • Rekursiooni baas ja samm

    Naiteid termineeruvast rekursioonist

    def bar(n):if n == 0 or n > 20:

    return 1else:

    return n � bar(�2�n)

    13 / 17

  • Rekursiooni baas ja samm

    Kahega jagamine

    def div2(n):if n

  • Rekursiooni baas ja samm

    Suurim uhistegur

    def gcd(n,m):if m == 0:

    return nelse:

    return gcd(m, n%m)

    15 / 17

  • Rekursioon

    Rekursiivsetes funktsioonides v~oivad "tegevused" toimudaenne ja/v~oi parast rekursiivset valjakutset.

    Enne rekursiivset valjakutset tehtavad tegevused toimuvad"kahanevalt".

    Parast rekursiivset valjakutset tehtavad tegevused toimuvad"kasvavalt".

    Arvude trukkimine kahanevalt

    def printDn(n):if n

  • Rekursioon

    Rekursiivsetes funktsioonides v~oivad "tegevused" toimudaenne ja/v~oi parast rekursiivset valjakutset.

    Enne rekursiivset valjakutset tehtavad tegevused toimuvad"kahanevalt".

    Parast rekursiivset valjakutset tehtavad tegevused toimuvad"kasvavalt".

    Arvude trukkimine kahanevalt

    def printDn(n):if n

  • Rekursioon

    Rekursiivsetes funktsioonides v~oivad "tegevused" toimudaenne ja/v~oi parast rekursiivset valjakutset.

    Enne rekursiivset valjakutset tehtavad tegevused toimuvad"kahanevalt".

    Parast rekursiivset valjakutset tehtavad tegevused toimuvad"kasvavalt".

    Arvude trukkimine kasvavalt

    def printUp(n):if n

  • Rekursioon

    Rekursiivsetes funktsioonides v~oivad "tegevused" toimudaenne ja/v~oi parast rekursiivset valjakutset.

    Enne rekursiivset valjakutset tehtavad tegevused toimuvad"kahanevalt".

    Parast rekursiivset valjakutset tehtavad tegevused toimuvad"kasvavalt".

    Arvude trukkimine kahanevalt ja seejarel kasvavalt

    def printDnUp(n): # printDnUp(3) trukib: 3if n

  • Suur tanu osalemast

    ja

    kohtumiseni!