Kurssisisältö
Java Laajennettu
Java Laajennettu
Rekurssio
Kuinka helposti rikkoa koodisi?
Miksi tämä voi rikkoa koodin? Koska se voi johtaa äärettömään rekursioon, mikä kuluttaa muistia loputtomasti ja heikentää laitteen suorituskykyä. Miksi sitten tarvitsemme rekursiota ollenkaan? Joissakin tapauksissa rekursio voi olla hyödyllinen, mutta sitä tulee käyttää harkiten. Esimerkiksi rekursio voi korvata while-silmukan. Tarkastellaan esimerkkiä, jossa rekursiota käytetään summan laskemiseen kaikista lukuun asti annetuista luvuista:
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; } }
Metodi calculateSum()
kutsuu itseään pienennetyillä arvoilla. Meillä on myös poistumiskohta tästä rekursiosta, kun muuttuja num
on nolla. Tämä metodi laskee kaikkien lukujen summan 1:stä parametriin asti, tässä tapauksessa 5
. Tarkastellaan vuokaaviota, joka havainnollistaa, miten rekursio toimii tämän metodin avulla:
Yllä oleva esimerkki havainnollistaa, miten metodi kutsuu itseään pienennetyillä arvoilla, ja kun se saavuttaa nollan, se palaa takaisin ylöspäin laskemalla summia yhteen. Voimme myös havaita, miten if
-lohkon runko suoritetaan, jossa lisätään num
metodikutsun palauttamaan arvoon pienemmällä arvolla. Väliarvot jokaisen metodikutsun jälkeen on merkitty nuolten viereen.
Voimmeko välttää rekursion käyttöä?
Rekursio voidaan myös korvata tavallisella silmukalla. Tarkastellaan esimerkkiä, jossa ensin käytetään rekursiivista metodia ja sitten for
-silmukkaa saman toiminnon suorittamiseen:
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; } }
Tässä näemme, kuinka korvaamme rekursiivisen metodimme tavallisella for
-silmukalla, käyttäen muuttujaa i
kasvattamaan result
-arvoa jokaisella kierroksella lisäämällä siihen i
, kunnes se saavuttaa määritetyn luvun num
, joka on metodin parametri.
Yhteenveto
Yhteenvetona voidaan todeta, että rekursiiviset metodit voivat olla hyödyllisiä, mutta myös riskialttiita. Rekursion voi usein korvata silmukoilla, ja vaikka se voi yksinkertaistaa tiettyjä tehtäviä, se voi myös aiheuttaa ongelmia, jos sitä ei käytetä huolellisesti. Jos päätät käyttää rekursiota, toimi varoen, vaikka olisit kokenutkin.
1. Mitä rekursio tarkoittaa Javassa?
2. Kumpi on parempi käyttää, rekursio vai tavallinen silmukka?
Kiitos palautteestasi!