För utveckling av verksamhet, produkter och livskvalitet. Rekursiva algoritmer, en annan sort tänkande -Hur -När -Bra/Dåligt (kap 7)
För utveckling av verksamhet, produkter och livskvalitet. Rekursion ? En rekursiv metod är en metod som anropar sig själv. Liknar loopar / iterationer Rekursion är ett sätt att lösa ett problem genom att dela problemmet i flera identiska men mindre subproblem, dvs. metoden anropar sig själv med ” ett mindre argument”. Summan av n
För utveckling av verksamhet, produkter och livskvalitet. Exempel public static int sumOf(int n) { if(n==1) return 1; else return sumOf(n-1) +n; } !! basfall Se till att den rekursiva anropet alltid leder till basfallet
För utveckling av verksamhet, produkter och livskvalitet. Det största gemensamma divisorn (greatest common divisor) tilllämpas i krypteringsalgoritmer public static long gcd (long a,long b) { if(b==0) return a; else if(a>=b) return gcd(a-b,b); else return gcd(b,a); } public static long gcd(long a,long b) { if(b==0) return a; else return gcd(b,a%b); }
För utveckling av verksamhet, produkter och livskvalitet. En enkel lösning till ett komplicerat problem ”the towers of Hanoi ” En grupp munkar på 1800 talet fick i uppdrag att flytta 64 skivor guld (med olika diameter) från ett torn till ett annat. När arbetet var klart skulle jorden gå under. Följande regler skulle följas: 1)Flytta en disk i taget 2)Ingen skiva med större diameter får ligga över en med mindre. 3)En temporärt torn kan användas så länge regel 1och 2 följs. Hur lång tid tar det att slutföra arbetet om det tar 1 min för varje flytt?
För utveckling av verksamhet, produkter och livskvalitet. Towers of Hanoi, lösning
För utveckling av verksamhet, produkter och livskvalitet. Implementation void hanoi(int n, char from, char to, char h){ if(n>0){ hanoi(n-1,from,h,to); System.out.println(from+" --> "+to); hanoi(n-1,h,to,from); }
För utveckling av verksamhet, produkter och livskvalitet. En dålig lösning till ett enkelt problem På talet hittar Leonardo Fibonacci en sekvens av tal för att modelera antalet avkommer från ett kanin par F0=1 F1=1 F2=2 F3=3 F4=5 Fn=Fn-1+Fn-2
För utveckling av verksamhet, produkter och livskvalitet. Rekursiv algoritm för fibonacci int fibonacci(n) { if(n==0)|| (n==1) return 1 else return fibonacci(n-1)+fibonacci(n-2) } Tidskomplexitet
För utveckling av verksamhet, produkter och livskvalitet. Dinamisk programmering Princip: Beräkna ny värde genom att använda de senaste beräknade värde public static int fibonacci (int n) { if(n<=1) return 1; else { int first=1; int next=1;int fibTal=0; for (int i=1;i<n;i++) { fibTal=first+next; first=next; next=fibTal; } return fibTal; }