TILLÄMPAD DATALOGI (TILDA) Övning 3
Problemträd Bredden först Djupet först
class RekursionPalindrom { public static void main(String [] args) { String n1 = ”david”; String n2 = ”anna”; System.out.println(ärPalindrom(n1)); System.out.println(ärPalindrom(n2)); } public static boolean ärPalindrom(String s) { int len = s.length(); // basfall 1 if (len <= 1) { return true; } // basfall 2 else if (s.charAt(0) != s.charAt(len-1)) { return false; } // rekursion else { String s2 = s.substring(1, len-1); return ärPalindrom(s2); } }}
Problemträd
Problem: Erhåll talet (100) på kortast sätt med hjälp av talet fyra (4) och de tre räknesätten addition (+), subtraktion (-) och multiplikation (*). Exempel: 4 * * = 100 Problemträd: 4 4 4 4 4 4 4 4 4 4 4
Problem: En teknolog som glömt sin tresiffriga portkod tryckte sej igenom alla tusen kombinationer så här: Det kräver 3000 tryckningar. Man kan dock börja med 000 och sedan klara sig med 999 tryckningar om man har en supersmart sekvens där varje tresiffrigt tal förekommer någonstans. Hur ser sekvensen ut? Problemträd:
Sökning i problemträd Bredden först
Djupet först Sökning i problemträd
Hitta lösning på minimalt avstånd Bredden först
Hitta lösning på minimalt avstånd Djupet först
Hitta en lösning då lösningarna finns på långt avstånd Bredden först
Hitta en lösning då lösningarna finns på långt avstånd Djupet först
Bredden först görs oftast med en kö Kö
Djupet först görs oftast med rekursion eller stack
Problem: Erhåll talet (100) på kortast sätt med hjälp av talet fyra (4) och de tre räknesätten addition (+), subtraktion (-) och multiplikation (*). Exempel: 4 * * = 4 4 4 4 4 4 4 4 4 4 4 Kö
Problem: En teknolog som glömt sin tresiffriga portkod tryckte sej igenom alla tusen kombinationer så här: Det kräver 3000 tryckningar. Man kan dock börja med 000 och sedan klara sig med 999 tryckningar om man har en supersmart sekvens där varje tresiffrigt tal förekommer någonstans. Hur ser sekvensen ut?
class BreddenForstFindNr { p s v main(String [] args){ FindNr fn=new FindNr(4,100); fn.find(); } class FindNr { int nr, goal; Queue q; public FindNr(int nr, int g) { this.nr = nr; goal = g; q = new Queue(); } public void find() { q.put(new Node(nr, ””, null)); while (! q.isEmpty() ) { makeSons( q.get() ); } public void makeSons(Node n) { if (n.sum == goal) { writeChain(n); } q.put(new Node(n.sum-nr, ”-”, n)); q.put(new Node(n.sum+nr, ”+”, n)); q.put(new Node(n.sum*nr, ”*”, n)); } fn nr 4 q head null tail sum 4 oper ”” father null sum 0 oper - father sum 8 oper + father sum 16 oper * father sum -4 oper - father info null next info null next info null next info null next info null next n goal 100
Finn fem fel
class FinnFemFel { public static void main(String [] args) { Mio mio = new Mio(); System.out.println("Vad vill du att programmet skriver ut?"); String text = mio.getWord(); System.out.println("Hur många gånger?"); int antal = mio.getWord(); skriv(antal, text); } public static double skriv(String s, int antal) { for (int i = 1; i < antal; i++) { System.out.print(text + ” ”); } Vad vill du att programmet skriver ut? Hej Hur många gånger? 5 Hej Hej Hej Hej Hej