Rekursion
En metoddefinition som innehåller ett anrop av sig själv kallas rekursiv.
Rekursion En metoddefinition som innehåller ett anrop av sig själv kallas rekursiv. För att kunna använda rekursion behöver man: Ett problem som innehåller ett eller flera liknande delproblem Ett basfall som kan lösas utan rekursion Ett sätt att göra problemet enklare så att det närmar sig, och slutgiltigen når basfallet
Rekursion Ett exempel: N Σ i i=1
Rekursion Ett exempel: N N-1 Σ i = N + Σ i i=1 i=1
Rekursion Ett exempel: N N-1 N-2 Σ i = N + Σ i = N + N-1 + Σ i =... i=1 i=1 i=1
Rekursion Ett exempel: N N-1 N-2 Σ i = N + Σ i = N + N-1 + Σ i = i=1 i=1 i=1 = N + N-1 + N
Rekursion Ett problem som innehåller ett eller flera liknande delproblem Ett basfall som kan lösas utan rekursion Ett sätt att göra problemet enklare så att det närmar sig, och slutgiltigen når basfallet
Rekursion Ett exempel: N N-1 Σ i = N + Σ i = N + N i=1 i=1 Basfall: om N=1 blir summan = 1 Annars: summan(N) = N + summan(N-1)
Rekursion Basfall: om N=1 blir summan = 1 Annars: summan(N) = N + summan(N-1) public int sum(int n) { if (n==1) return 1; else return n + sum(n-1); }
Rekursion Vad händer om man tar bort basfallet? public int sum(int n) { //if (n==1) // return 1; // else return n + sum(n-1); }
Rekursion main: sum(3); sum sum(2); sum sum(1); sum Resultat = 1 Resultat = 3 Resultat = 6
Rekursion och loop public int sum(int n) { if (n==1) return 1; else return n + sum(n-1); } public int sumLoop(int n) { int sum = 0; for (int i =1; i<=n; i++) { sum = sum + i; } return sum; } Tiden är i båda fallen proportionell mot n
Rekursion Övningar: Vad kommer att skrivas ut om metoderna visa anropas med argumentet 0? public static void visa1(int tal) { if (tal < 10) visa1(tal + 1); else System.out.println(tal); } public static void visa2(int tal) { System.out.println(tal); if (tal < 10) visa2(tal + 1); }