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!