Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Relevanta dokument
Föreläsning 8: Exempel och problemlösning

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 2. Länkad lista och iterator

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 6 Innehåll. Rekursion. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursiv problemlösning. Rekursion. Rekursivt tänkande:

Algoritmer. Två gränssnitt

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 13. Rekursion

Föreläsning 11 Datastrukturer (DAT037)

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Länkade strukturer. (del 2)

Föreläsning 2. Länkad lista och iterator

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning Datastrukturer (DAT036)

Föreläsning 12: Exempel och problemlösning

Föreläsning 4 Datastrukturer (DAT037)

Tentamen i Objektorienterad programmering

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Föreläsning 3. Stack

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 3. Stack

Rekursion. Koffman & Wolfgang kapitel 5

Föreläsning 12 Innehåll

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Tentamen i Algoritmer & Datastrukturer i Java

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Föreläsning 1, vecka 7: Rekursion

Föreläsning 7. Träd och binära sökträd

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

DAT043 Objektorienterad Programmering

Rekursion och induktion för algoritmkonstruktion

Typkonvertering. Java versus C

Föreläsning 4 Innehåll

Föreläsning 11 Innehåll

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Tentamen i Objektorienterad programmering E

Föreläsning 11: Rekursion

OOP Objekt-orienterad programmering

Föreläsning 3 Datastrukturer (DAT037)

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Kurskod D0010E Datum Skrivtid 5tim

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Tentamen Datastrukturer (DAT037)

Föreläsning 10. ADT:er och datastrukturer

Lösningsförslag till tentamen Datastrukturer, DAT037,

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen Programmering fortsättningskurs DIT950

Dugga i Grundläggande programmering STS, åk

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen Datastrukturer, DAT037,

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

JAVAUTVECKLING LEKTION 8

Lösningsförslag till exempeltenta 2

Föreläsning 3 Datastrukturer (DAT037)

Stackar, köer, iteratorer och paket

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Laboration 13, Arrayer och objekt

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Tentamen Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 11. ADT:er och datastrukturer

Tentamen Datastrukturer (DAT036)

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Lösningsförslag till exempeltenta 1

Föreläsning 12 Innehåll

Transkript:

Objektorienterad programmering E Föreläsning 10 Rekursion Länkade datastrukturer Back to Basics Exekvera programmet för hand! public class Param { public static int f(int x) { return x+1; public static void p(int x) { System.out.println("in p"); q(2*x); public static void q(int x) { System.out.println("in q: " + x); public static void main(string[] args) { p(f(3)); Ett enkelt exempel En annan version av printtable Skriv programmet Table > java Table 10 n n^2 n^3 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 public static void printtable(int rows) { if (rows==0) System.out.printf("%4s %8s %8s\n","n","n^2","n^3"); else { printtable(rows-1); System.out.printf("%4d %8d %8d\n",rows, rows*rows, rows*rows*rows); Rekursion Definitionen ovan är rekursiv; vi anropar subrutinen själv i dess definition. Hur kan det fungera?

Rekursiva definitioner Tornen i Hanoi Nödvändig restriktion I en rekursiv definition måste det finnas ett basfall; något värde på argumentet där man ger resultatet utan rekursion. varje rekursivt anrop göras med ett argument som är mindre, dvs närmare basfallet. Rekursionsantagande När man gör en definition som ovan kan man i det rekursiva fallet anta att det rekursiva anropet gör vad det ska göra. Jämför med induktionsbevis i matematiken! Ett berömt exempel Uppgift: flytta alla brickor från pinne 1 till pinne 2. Pinne 3 får användas som hjälp. En bricka i taget flyttas och en större bricka får aldrig ligga ovanpå en mindre. Att lösa tornen i Hanoi??? Det är inte alls lätt att beskriva vilken som ska vara nästa flyttning vid ett givet tillstånd mitt i spelet. Ett lättare problem(?) Skriv ett program som skriver ut lösningen (ingen grafik): > java HanoiText 3 Flytta från 1 till 3 Flytta från 2 till 3 Flytta från 3 till 1 Flytta från 3 till 2 > Lösningen: rekursion public class HanoiText { public static void move(int n,int from,int to,int aux) { //Flytta n brickor från pinne from till pinne to // med pinne aux som hjälp.??? public static void main(string[] args) { move (Integer.parseInt(args[0]),1,2,3);

Tornen i Hanoi med animering Hela lösningen räknas ut redan i modellklassens konstruerare och lagras (som en lista av Move-objekt): private void computemoves(int size,int from,int to,int aux){ if (size==0) return; computemoves(size-1,from,aux,to); moves.addlast(new Move(from,to)); computemoves(size-1,aux,to,from); Vid varje Step tas ett element ur listan och denna flyttning görs i modellen. Se kod på kursens webbplats. Insättningssortering, återbesök public static void isort(int[] a, int from, int to) { for (int i=from+1; i < to; i++) { int tmp = a[i]; int j = i-1; while (j >=from && tmp < a[j]) { a[j+1] = a[j]; j--; a[j+1] = tmp; public static void isort(int[] a) { isort(a,0,a.length); Hur kan man sortera ett fält effektivare? Mergesort, idé Om fältet är kort (t ex < 10 element), använd insättningssortering. Annars, sortera första och andra halvan var för sig (rekursivt, med mergesort). Det återstår sedan att sortera ihop de två sorterade halvorna. Detta går fort, men kräver ett extra fält. Förberedelser (skapa och fyll ett hjälpfält) public static void msort(int[] a) { int[] aux = new int[a.length]; for (int i=0; i<a.length; i++) aux[i] = a[i]; msort(aux, a, 0,a.length); Mergesort, huvudalgoritmen I nedanstående rutin innehåller de två fälten src och dest samma tal vid anropet. Det sorterade resultatet ska finnas i dest efteråt. Hjälprutinen merge (nästa slide) samsorterar halvorna från src till dest. public static void msort(int[] src, int[] dest, int from, int to) { if (to-from<8) isort(dest,from,to); else { int mid = (from + to)/2; msort(dest,src,from,mid); msort(dest,src,mid,to); merge(src,dest,from,mid,to);

Till sist: merge Köer public static void merge(int[] src, int[] dest, int from, int mid, int to) { int p = from; int q = mid; for (int i=from; i < to; i++) if (q >= to p < mid && src[p] <= src[q]) { dest[i] = src[p]; p++; else { dest[i] = src[q]; q++; Vanligt i tillämpningar Många program behöver lagra objekt i listor som fungerar som köer: Man kan bara sätta in objekt sist i kön och bara ta ut det element som står först i kön. Man kan använda en klass som LinkedList för detta, men bättre är att ha ett mer begränsat interface: public interface Queue<E> { public void enqueue(e elem); public E dequeue(); public boolean isempty(); En möjlig implementation av Queue Noder import java.util.*; public class SimpleQueue<E> implements Queue<E> { private LinkedList<E> list; public SimpleQueue() {list = new LinkedList<E>(); public void enqueue(e elem) {list.addlast(elem); public E dequeue() {return list.remove(0); public boolean isempty() {return list.isempty(); Delegation På föregående bild implementerade vi Queue genom att ha en tillståndsvariabel av typ LinkedList och delegera allt arbete till denna. Detta är en utmärkt implementation, men vi gör ändå en egen, som samtidigt ger en aning om hur LinkedList är gjord. Hjälpklassen Node public class Node<E> { E elem; Node<E> next;

Länkade strukturer Köer som länkade strukturer Flera objekt av typen Node kan länkas ihop, illustrerat för Node<Integer>: Objekt av typen Integer Vi kan representera en kö som en sådan länkad struktur. Vi sätter in element i slutet på listan; det är då praktiskt att ha en referens också till den sista noden: 5 4 8 6 value Objekt av typen Integer 5 4 8 6 value Node<Integer> list elem null next Node<Integer> first elem Objekt av typen Node<Integer> Node<Integer> last null next Objekt av typen Node<Integer> Klassen LinkedQueue public class LinkedQueue<E> implements Queue<E> { private static class Node<E> { E elem; Node<E> next; private Node<E> first; private Node<E> last; public LinkedQueue() { Metoderna definieras på föreläsningen