Transcript hanoi
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 1+2+3+4+5 + ......+n
För utveckling av verksamhet, produkter och livskvalitet.
Exempel
public static int sumOf(int n)
{
if(n==1) !! basfall
return 1;
else
return sumOf(n-1) +n;
}
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)
2)
3)
Flytta en disk i taget
Ingen skiva med större
diameter får ligga över
en med mindre.
En temporärt torn kan
användas så länge regel 1och 2
följs.
Hur lång tid tar det att slutföra
För utveckling
av verksamhet,
och livskvalitet.
arbetet
om det tarprodukter
1 min för
varje flytt?
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å 1300- talet hittar Leonardo Fibonacci en sekvens
av tal för att modelera antalet avkommer från ett
kanin par.
1 1 2 3 5 8 13 ........
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
Tidskomplexitet
int fibonacci(n)
{
if(n==0)|| (n==1)
return 1
else
return fibonacci(n-1)+fibonacci(n-2)
}
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;
}
För utveckling av verksamhet, produkter och livskvalitet.