240 likes | 416 Views
L14 Rekursiivsed algoritmid. Ülesanne Algoritm Programm. Ülesanne : leida antud lõigul [ i ; j ] asuvate naturaalarvude korrutis ( i ja j on naturaalarvud). Konkreetne ülesanne: lõik on [3; 6],
E N D
Ülesanne Algoritm Programm
Ü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
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) long korrutis(int i, int 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
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).
. . . Ülesanne Algoritm Konkreetne ülesanne (1) Konkreetne ülesanne (2) Konkreetne ülesanne (3) . . . Programm . . . Algoritm’ Programm . . . Täpne ülesande seade, ülesande püstitus Täpne lahenduskava, lahenduse idee Täpne eeskiri arvutile, algor. realisatsioon
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)
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 IllegalArgumentException{ // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j if(i < 1 || j < 1) throw new IllegalArgumentException(); long tulem = 1; while(i <= j){ tulem *= i++; }//while return tulem; }//korrutis
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) { // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j long tulem = 1; for(; i <= j; i++){ tulem *= i; }//for return tulem; }//korrutis
BigInteger korrutis(int i, int j) { // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j BigInteger tulem = new BigInteger(“1”); for(; i <= j; i++){ tulem = tulem.multiply( new BigInteger( new Integer(i).toString())); }//for return tulem; }//korrutis 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)
ALGORITM Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud). 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 (t) i > k ? t := t× k k := k - 1
ALGORITM Ülesanne: viilutada antud päts. 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
ALGORITM Ülesanne: lõhkuda antud pakk. 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
ALGORITM Ülesanne: lõhkuda antud pakk. lõhkuda(p) --- Antud: pakk p --- Tulemus: pakk p lõhutud, --- halud pandud kasti p paksus 15 cm? panna p kasti lüüa pakk p pooleks - kaheks pakuks p1 ja p2; lõhkuda(p1); lõhkuda(p2) rekursiivne rakendus
ALGORITM Ülesanne: viilutada antud päts. viilutada(p) --- Antud: päts p --- Tulemus: päts p viilutatud, --- viilud pandud kasti p paksus 1 cm? panna p kasti lõigata päts p pooleks - kaheks pätsiks p1 ja p2; viilutada(p1); viilutada(p2) rekursiivne rakendus
ALGORITM Ülesanne: viilutada antud päts. viilutada(p) --- Antud: päts p --- Tulemus: päts p viilutatud, --- viilud pandud kasti p paksus 1 cm? panna p kasti lõigata päts p kaheks - pätsiks p1 ja viiluks, viil panna kasti; viilutada(p1) rekursiivne rakendus
ALGORITM Ülesanne: leida antud lõigul [i; j] asuvate naturaalarvude korrutis (i ja j on naturaalarvud). “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) t := i×k (t) i > j? (1) (i × korrutis(i+1, j))
ALGORITM Ülesanne: leida antud lõigul [i; j] asuvate naturaal- arvude korrutis (i ja j on naturaal- arvud). “pooleks lõikamisega” korrutis(i, j) --- Antud: naturaalarvud i, j --- Tulemus: tagastatakse --- korrutis i×(i+1) × …× j 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))
PROGRAMM PROGRAMM // “pooleks lõikamisega” // “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(n <= 0) return 1; if(n == 1) return i; k = n/2; return korrutis(i, i+k-1)* korrutis(i+k, j)); }//korrutis long korrutis(int i, int j){ // Antud: naturaalarvud i, j // Tulemus: tagastatakse // korrutis i×(i+1) × …× j if(i > j) return 1; return i*korrutis(i+1, j); }//korrutis
ALGORITM Ülesanne: leida antud mitte- negatiivse täisarvu faktoriaal. faktoriaal(n) --- Antud: mittenegat. täisarv n --- Tulemus: tagastatakse n! --- Alamalgoritm: korrutis( ) n = 0? (1) (korrutis(1, n)) Definitsioon 1. Naturaalarvu n faktoriaal n! = 1×2× . . . ×n. Arvu 0 faktoriaal 0! = 1.
ALGORITM Ülesanne: leida antud mitte- negatiivse täisarvu faktoriaal. faktoriaal(n) --- Antud: mittenegat. täisarv n --- Tulemus: tagastatakse n! n = 0? (1) (faktoriaal(n-1) × n) Definitsioon 2. Mittenegatiivse täis- arvu n faktoriaal n!: a)kui n = 0, siis n! = 1; b) kui n > 0, siis n! = (n-1)! × n.
ALGORITM hanoi(a, b, c, n) --- 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) a b c a b c
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-->3 1-->2 3-->2 3-->1 2-->1 3-->2 1-->3 1-->2 3-->2