Rekursiivsed algoritmid 1 lesanne Algoritm Programm 2 lesanne

  • Slides: 24
Download presentation
Rekursiivsed algoritmid 1

Rekursiivsed algoritmid 1

Ülesanne Algoritm Programm 2

Ülesanne Algoritm Programm 2

Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud).

Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud). Konkreetne ülesanne: lõik on [3; 6], teguriteks on arvud 3, 4, 5 ja 6. Vastus: 360 Konkreetne ülesanne: lõik on [13; 21], teguriteks on arvud 13, 14, 15, 16, 17, 18, 19, 20, 21. Vastus: 106661318400 Konkreetne ülesanne: lõik on [3; 3], ainukeseks “teguriks” on arv 3. Vastus: 3 Konkreetne ülesanne: lõik on [3; 2] (tühi), tegureid ei ole. Vastus: 1 3

PROGRAMM ALGORITM long korrutis(int i, int j){ korrutis(i, j) // Antud: naturaalarvud i, j

PROGRAMM ALGORITM long korrutis(int i, int j){ korrutis(i, j) // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) × …× j long tulem = 1; while(i <= j){ tulem = tulem * i; i++; }//while return tulem; }//korrutis t : = 1; k : = i k j? t : = t × k k : = k + 1 (t) 4

Algoritm: • tegevusplaan ülesande lahendamiseks teatavate lihtsamate operatsioonide teostamise teel; • ülesande lahendamise skeem;

Algoritm: • tegevusplaan ülesande lahendamiseks teatavate lihtsamate operatsioonide teostamise teel; • ülesande lahendamise skeem; • ülesande lahendamiskäigu kirjeldus. Programm: kindlale täitjale (arvutile) orienteeritud tegevuseeskiri ülesande lahendamiseks, tavaliselt mingi algoritmi realisatsioon (seade arvutile). 5

Ülesanne Konkreetne ülesanne (1) Konkreetne ülesanne (2) Konkreetne ülesanne (3). . . Algoritm .

Ülesanne Konkreetne ülesanne (1) Konkreetne ülesanne (2) Konkreetne ülesanne (3). . . Algoritm . . . Programm Algoritm’ . . . Programm. . . Täpne ülesande seade, lahenduskava, ülesande püstitus lahenduse idee Täpne eeskiri arvutile, algor. realisatsioon 6

ALGORITM PROGRAMM korrutis(i, j) ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) ×

ALGORITM PROGRAMM korrutis(i, j) ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) × …× j t : = 1; k : = i k j? t : = t × k k : = k + 1 (t) 7

korrutis(i, j) ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) × …× j

korrutis(i, j) ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) × …× j t : = 1; k : = i k j? t : = t × k k : = k + 1 (t) long korrutis(int i, int j) throws Illegal. Argument. Exception{ // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j if(i < 1 || j < 1) throw new Illegal. Argument. Exception(); long tulem = 1; while(i <= j){ tulem *= i++; }//while return tulem; }//korrutis 8

korrutis(i, j) long korrutis(int i, int j) { ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse

korrutis(i, j) long korrutis(int i, int j) { ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j --- korrutis i×(i+1) × …× j t : = 1; k : = i k j? t : = t × k k : = k + 1 (t) long tulem = 1; for(; i <= j; i++){ tulem *= i; }//for return tulem; }//korrutis 9

korrutis(i, j) ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) × …× j

korrutis(i, j) ---Antud: naturaalarvud i, j ---Tulemus: tagastatakse --- korrutis i×(i+1) × …× j t : = 1; k : = i k j? t : = t × k k : = k + 1 (t) Big. Integer korrutis(int i, int j) { // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j Big. Integer tulem = new Big. Integer(“ 1”); for(; i <= j; i++){ tulem = tulem. multiply( new Big. Integer( new Integer(i). to. String())); }//for return tulem; 10 }//korrutis

Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud).

Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud). ALGORITM korrutis(i, j) --- Antud: naturaalarvud i, j --- Tulemus: tagastatakse --korrutis i×(i+1) × …× j t : = 1; k : = j i > k? t : = t × k k : = k - 1 i k? t : = t × k k : = k - 1 (t) 11

Ülesanne: viilutada antud päts. ALGORITM viilutada(p) --- Antud: päts p --- Tulemus: päts p

Ülesanne: viilutada antud päts. ALGORITM viilutada(p) --- Antud: päts p --- Tulemus: päts p viilutatud, --viilud pandud kasti p paksus 1 cm? panna p kasti lõigata pätsi p paremast otsast viil, panna see kasti 12

Ülesanne: lõhkuda antud pakk. ALGORITM lõhkuda(p) --- Antud: pakk p --- Tulemus: pakk p

Ülesanne: lõhkuda antud pakk. ALGORITM lõhkuda(p) --- Antud: pakk p --- Tulemus: pakk p lõhutud, --halud pandud kasti p paksus 15 cm? panna p kasti lüüa paku p paremast küljest halg, panna see kasti 13

Ülesanne: lõhkuda antud pakk. ALGORITM lõhkuda(p) --- Antud: pakk p --- Tulemus: pakk p

Ülesanne: lõhkuda antud pakk. ALGORITM lõhkuda(p) --- Antud: pakk p --- Tulemus: pakk p lõhutud, --halud pandud kasti p paksus 15 cm? panna p kasti rekursiivne rakendus lüüa pakk p pooleks kaheks pakuks p 1 ja p 2; lõhkuda(p 1); lõhkuda(p 2) 14

Ülesanne: viilutada antud päts. ALGORITM viilutada(p) --- Antud: päts p --- Tulemus: päts p

Ülesanne: viilutada antud päts. ALGORITM viilutada(p) --- Antud: päts p --- Tulemus: päts p viilutatud, --viilud pandud kasti p paksus 1 cm? panna p kasti rekursiivne rakendus lõigata päts p pooleks kaheks pätsiks p 1 ja p 2; viilutada(p 1); viilutada(p 2) 15

Ülesanne: viilutada antud päts. ALGORITM viilutada(p) --- Antud: päts p --- Tulemus: päts p

Ülesanne: viilutada antud päts. ALGORITM viilutada(p) --- Antud: päts p --- Tulemus: päts p viilutatud, --viilud pandud kasti p paksus 1 cm? panna p kasti rekursiivne rakendus lõigata päts p kaheks pätsiks p 1 ja viiluks, viil panna kasti; viilutada(p 1) 16

Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud).

Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud). ALGORITM “otsast lõikamisega” korrutis(i, j) --- Antud: naturaalarvud i, j --- Tulemus: tagastatakse --korrutis i×(i+1) × …× j i > j? (1) k : = korrutis(i+1, j) (i × korrutis(i+1, j)) t : = i×k (t) 17

ALGORITM Ülesanne: leida “pooleks lõikamisega” antud lõigul [i; j] korrutis(i, j) asuvate naturaal--- Antud:

ALGORITM Ülesanne: leida “pooleks lõikamisega” antud lõigul [i; j] korrutis(i, j) asuvate naturaal--- Antud: naturaalarvud i, j arvude korrutis (i ja j on naturaal- --- Tulemus: tagastatakse --korrutis i×(i+1) × …× j arvud). n : = j - i + 1; --- tegurite arv n 0? (1) --- tegureid ei ole n = 1? (i) --- on üks tegur k : = (korrutis(i, i+k-1)×korrutis(i+k, j)) 18

PROGRAMM // “pooleks lõikamisega” PROGRAMM // “otsast lõikamisega” long korrutis(int i, int j){ //

PROGRAMM // “pooleks lõikamisega” PROGRAMM // “otsast lõikamisega” long korrutis(int i, int j){ // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j int n = j - i + 1; if(i > j) return 1; if(n <= 0) return 1; if(n == 1) return i; return k = n/2; i*korrutis(i+1, j); return korrutis(i, i+k-1)* korrutis(i+k, j)); }//korrutis 19

ALGORITM Ülesanne: leida antud mitte- faktoriaal(n) negatiivse täisarvu faktoriaal. --- Antud: mittenegat. täisarv n

ALGORITM Ülesanne: leida antud mitte- faktoriaal(n) negatiivse täisarvu faktoriaal. --- Antud: mittenegat. täisarv n --- Tulemus: tagastatakse n! Definitsioon 1. --- Alamalgoritm: korrutis( ) Naturaalarvu n faktoriaal n = 0? n! = 1× 2×. . . ×n. (1) Arvu 0 faktoriaal 0! = 1. (korrutis(1, n)) 20

Ülesanne: leida antud mittenegatiivse täisarvu faktoriaal. Definitsioon 2. Mittenegatiivse täisarvu n faktoriaal n!: a)

Ülesanne: leida antud mittenegatiivse täisarvu faktoriaal. Definitsioon 2. Mittenegatiivse täisarvu n faktoriaal n!: a) kui n = 0, siis n! = 1; b) kui n > 0, siis n! = (n-1)! × n. ALGORITM faktoriaal(n) --- Antud: mittenegat. täisarv n --- Tulemus: tagastatakse n! n = 0? (1) (faktoriaal(n-1) × n) 21

ALGORITM hanoi(a, b, c, n) a b c --- Antud: platsid a, b ja

ALGORITM hanoi(a, b, c, n) a b c --- Antud: platsid a, b ja c; --- n - tõstetavate ketaste arv --- Tulemus: n pealmist ketast --- platsilt a tõstetud platsile b (pealmisteks) --- kasutades platsi c laoplatsina hanoi(a, c, b, n-1) tõsta üks ketas platsilt a platsile b hanoi(c, b, a, n-1) 22

class Hanoi{ static void hanoi(int a, int b, int c, int n){ if(n ==

class Hanoi{ static void hanoi(int a, int b, int c, int n){ if(n == 0) return; hanoi(a, c, b, n-1); System. out. print(” ” + a + "-->" + b); hanoi(c, b, a, n-1); } public static void main(String[ ] a){ hanoi(1, 2, 3, 4); } }//Hanoi 1 -->3 1 -->2 3 -->2 1 -->3 2 -->1 2 -->3 1 -->2 3 -->1 2 -->1 3 -->2 1 -->3 1 -->2 3 -->2 23

24

24