Prednosti in slabosti rekurzije in zanke v Javi
Pros Cons Recursion
Prednosti in slabosti rekurzije in zanke v Javi
Uvod:
Odprete vrata s ključem v roki in ugotovite, da so pred vami vrata, nato s ključem odprete vrata in nato spet zagledate vrata. ... ko pa se pripeljete do vrat, ugotovite, da pred steno ni mogoče iti, se odločite za vrnitev prvotne poti - to je rekurzija.
Če pa odpreš vrata, ugotoviš tudi, da so vrata spredaj, nato pa odpreš naslednja vrata ..... vendar se nikoli ne dotakneš konca-- To je zanka.
Preprosto povedano: zanke nimajo poti nazaj, rekurzija pa se lahko vrne nazaj (ker obstaja pogoj zaključka).
Loop: Ponovi dejanje (telo zanke), ko je izpolnjen določen pogoj.
Rekurzija: način samopoklica znotraj metode.
Rekurzivna struktura je sestavljena iz dveh delov:
1. Rekurzivna glava: Ko ne pokliče lastne metode, to je rekurzivnega končnega stanja. Če rekurzivne glave ni, bo program zapadel v neskončno zanko.
2. Rekurzivno telo: kadar morate poklicati svojo metodo.
Ok, nič več neumnosti, samo pridite do kode (način izračuna faktorja).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | package com.bjwyj.method /** * Comparison of recursion and loop * @author * */ public class TestRecursion { public static void main(String[] args) { //The following call to the currentTimeMillis() method under System is just to show that recursive calls are more time consuming than loop calls. long l1 = System.currentTimeMillis() System.out.println(factorial( 5 )) long l2 = System.currentTimeMillis() System.out.println( 'Recursive calculation of factorial time-consuming:' +(l2-l1)) System.out.println( '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' ) long time1 = System.currentTimeMillis() System.out.println(factorialLoop( 5 )) long time2 = System.currentTimeMillis() System.out.println( 'Cycle calculation factorial time-consuming:' +(time2-time1)) } / / Use recursive definition method to calculate factorial public static long factorial( int num) { if (num== 1 ) { //Recursive head return 1 } else { return num*factorial(num- 1 ) //Recursive body } } / / Use the loop definition to calculate the factorial method public static long factorialLoop( int n) { int result = 1 / / Receive calculation results while (n> 1 ) { result *= n*(n- 1 ) / / To achieve the calculation of the result of the multiplication operation n -= 2 / / Each time minus 2, to achieve the iterative operation of the number } return result } } |
Rezultati:
1 2 3 4 5 | 120 Recursively calculate the factorial time: 1 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 120 Cycle calculation factorial time: 0 |
Kot je razvidno iz rezultatov, je uporaba rekurzivnega algoritma bolj zamudna kot uporaba algoritma zanke.
Da bi bolje primerjali prednosti in slabosti rekurzivnega algoritma, zgoraj omenjeno zanko while primerjamo z rekurzivnim algoritmom.
Najprej analizirajte postopek izvajanja zgoraj navedene rekurzivne metode, kot je prikazano spodaj:
Postopek izvajanja metode zanke je naslednji:
Tukaj, da bi bil videti jasen, preprosto nariše postopek izvrševanja v pomnilniku sklada (tako da je risbo lažje razumljivo).
da povzamem:
Sklop se v glavnem uporablja za shranjevanje okvirov skladov. Vsakokrat, ko se metoda izvede, se izvede potisna operacija. Zato je v rekurzivnem načinu več okvirov skladov in rekurzija bo vplivala na pomnilnik. Zelo drag spomin. Z uporabo zanke se izvede metoda, ki potisne okvir sklada enkrat in ima samo en okvir sklada, zato prihrani pomnilnik.
Prvotni naslov https://www.cnblogs.com/wuyongji/p/10503391.html