Kursinnehåll
Java Fördjupad
Java Fördjupad
Rekursion
Hur du enkelt kan förstöra din kod?
Varför kan detta förstöra koden? Eftersom det kan leda till oändlig rekursion, vilket kommer att förbruka minne utan stopp och försämra enhetens prestanda. Så varför behöver vi rekursion överhuvudtaget? I vissa fall kan rekursion vara användbart, men det bör användas med försiktighet. Till exempel kan rekursion ersätta en while-loop. Låt oss titta på ett exempel där rekursion används för att beräkna summan av alla tal upp till ett tal som skickas som parameter:
Main.java
package com.example; public class Main { // main method to run the application public static void main(String[] args) { // do not modify the code below System.out.println(calculateSum(5)); } // method to calculate the sum of numbers from 1 to num using recursion static int calculateSum(int num) { // if num is greater than 0, recursively calculate the sum if (num > 0) { num = num + calculateSum(num - 1); } else { return 0; } return num; } }
Metoden calculateSum()
anropar sig själv med minskade värden. Vi har också en utgångspunkt från denna rekursion när variabeln num
blir noll. Denna metod beräknar summan av alla tal från 1 till parametern, i vårt fall 5
. Låt oss titta på flödesschemat som visar hur rekursion fungerar med denna metod som exempel:
Exemplet ovan visar hur metoden anropar sig själv med minskade värden, och när den når noll går den tillbaka upp genom att summera värdena. Vi kan också observera hur kroppen av if
-blocket exekveras, där vi lägger till num
till resultatet av metodanropet med ett minskat värde. De mellanliggande värdena efter varje metodanrop anges nära pilarna.
Kan vi undvika att använda rekursion?
Rekursion kan också ersättas med en vanlig loop. Låt oss titta på ett exempel där vi först använder en rekursiv metod och sedan använder en for
-loop för att utföra samma operation:
Main.java
package com.example; public class Main { // main method to run the application public static void main(String[] args) { // do not modify the code below int num = 5; // printing the result of the recursive sum calculation System.out.println("Result using recursion: " + calculateSum(num)); int result = 0; // calculating the sum using a for-loop for (int i = 1; i <= num; i++) { result = result + i; } // printing the result of the sum calculation using the for-loop System.out.println("Result using for-loop: " + result); } // method to calculate the sum of numbers from 1 to num using recursion static int calculateSum(int num) { // if num is greater than 0, recursively calculate the sum if (num > 0) { num = num + calculateSum(num - 1); } else { return 0; } return num; } }
Här ser vi hur vi ersätter vår rekursiva metod med en vanlig for
-loop, där vi använder variabeln i
för att öka vårt result
med i
varje gång tills det når det angivna talet num
, som är parametern i metoden.
Slutsats
Sammanfattningsvis kan rekursiva metoder vara användbara men också riskabla. Rekursion kan ofta ersättas av loopar, och även om det kan förenkla vissa uppgifter kan det också orsaka problem om det inte används försiktigt. Om du väljer att använda rekursion, även med erfarenhet, se till att vara försiktig.
1. Vad är rekursion i Java?
2. Vilket är bättre att använda, rekursion eller en vanlig loop?
Tack för dina kommentarer!