Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.1 Rekursion
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.2 E ::= E op E | “(“ E “)” | Tal op ::= “+” | “-” | “’” | “/” Tal ::= “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9” Rekursion, syntaksbeskrivelse * 9 E EEop EE * +TT 37 9
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.3 Rekursion, Java public void superTriangle(int d, int l) { // d >= 0 if ( d == 0 ) triangle(l); else { superTriangle(d-1, l/2); move(l/2); superTriangle(d-1, l/2); turn(120); move(l/2); turn(-120); superTriangle(d-1, l/2); turn(-120); move(l/2); turn(120); }
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.4 Mønster Termineringsregel: simpelt (evt. simple) tilfælde hvor rekursionen stopper Rekurrensregel: rekursin definition
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.5 E ::= E op E | “(“ E “)” | Tal Rekursion, syntaksbeskrivelse Rekurrensregler Termineringsregel
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.6 Rekursion, Java public void superTriangle(int d, int l) { // d >= 0 if ( d == 0 ) triangle(l); else { superTriangle(d-1, l/2); move(l/2); superTriangle(d-1, l/2); turn(120); move(l/2); turn(-120); superTriangle(d-1, l/2); turn(-120); move(l/2); turn(120); } Rekurrensregel Termineringsregel
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.7 Fibonacci-tal 1, 1, 2, 3, 5, 8, ? f 1 = 1 f 2 = 1 f n = f n-1 + f n-2 f 5 = f 4 + f 3 = (f 3 + f 2 ) + (f 2 + f 1 ) = ((f 2 + f 1 ) + f 2 ) + (f 2 + f 1 )
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.8 Fibonacci som Java-kode int fib (int n) { // pre: n >= 1 // post: fib(n) = f n (det n’te Fibonacci-tal) if ( n==1) return 1; else if ( n==2 ) return 1; else return fib(n-1) + fib(n-2); }
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.9 Introduktion Vi skal nu se nærmere på rekursion som en problem- løsningsteknik, og specielt skal vi senere i kurset se nærmere på skabelonen del, løs og kombinér som indfanger en stor klasse af rekursive algoritmer. Nu skal vi imidlertid hjælpe en flok munke med deres livsopgave...
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.10 Verdens centrum 64 skiver skal flyttes fra A til C via B. En ad gangen og aldrig en større oven på en mindre. BAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.11 Simpelt tilfælde BACBAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.12 Hvad med to? BACBAC BACBAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.13 Og tre? BACBAC BACBAC A,C A,BC,B
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.14 Tre, fortsat BACBAC BACBAC B,A B,CA,C
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.15 Hvad med fem eller ti? BAC BAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.16 Den gode idé BACBAC BACBAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.17 Algoritmen Flyt (5, A, C): Flyt(4, A, B) Flyt(1, A, C) Flyt(4, B, C) Flyt (N, A, C): Flyt(N-1, A, B) Flyt(1, A, C) Flyt(N-1, B, C) 5,A,C 4,A,B4,B,C 1,A,C N,A,C N-1,A,BN-1,B,C 1,A,C
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.18 Og i Java void flyt(int n, int s, int d, int t) { // pre: n >= 1 // post: der er udskrevet hvordan man flytter // n skiver fra s til d via t // s: source, d: destination, t: temporary if ( n==1 ) { System.out.println(s + ” -> “ + d); } else { flyt(n-1, s, t); flyt(1, s, d, 0); flyt(n-1, t, d); }
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.19 Output for n=5 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 2 -> 1 2 -> 3 1 -> 3 2 -> 1 3 -> 2 3 -> 1 2 -> 1 2 -> 3 1 -> 3 1 -> 2 3 -> 2 1 -> 3 2 -> 1 2 -> 3 1 -> 3
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.20 n # flytninger n ? Hvor mange flytninger?
Michael E. Caspersen, 2000Introducerende objektorienteret programmering7A.21 Hvor meget printerpapir? 1,845 x linier pr. kolonne 5 kolonner pr. side 2 sider pr. ark 2500 ark pr. kasse (25 x 40 x 40 cm 3 ) 50 kasser pr. m 2...