Rekursion 2
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.2 Introduktion Vi har tidligere set eksempler på rekursive funktioner, herunder superTriangle og fibonacci-funktionen. Vi skal nu se nærmere på rekursion som en problem- løsningsteknik, og specielt skal vi se nærmere på skabe- lonen del, løs og kombinér som indfanger en stor klasse af rekursive algoritmer. Først skal vi imidlertid hjælpe en flok munke med deres livsopgave...
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.3 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 programmeringRekursion 2.4 Simpelt tilfælde BACBAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.5 Hvad med to? BACBAC BACBAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.6 Og tre? BACBAC BACBAC A,C A,BC,B
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.7 Tre, fortsat BACBAC BACBAC B,A B,CA,C
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.8 Hvad med fem eller ti? BAC BAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.9 Den gode idé BACBAC BACBAC
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.10 Algoritmen Flyt (5, A, C): Flyt(4, A, B) Flyt(1, A, C) Flyt(4, B, C) 5,A,C 4,A,B4,B,C 1,A,C Flyt (N, A, C): Flyt(N-1, A, B) Flyt(1, A, C) Flyt(N-1, B, C) N,A,C N-1,A,BN-1,B,C 1,A,C
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.11 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, d); flyt(1, s, d, t, 0); flyt(n-1, t, d, s); }
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.12 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 programmeringRekursion 2.13 n # flytninger n ? Hvor mange flytninger?
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringRekursion 2.14 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...