faktoriális rekurzív

1.8 példa mutatja egy még további számítási módszerét faktoriális. Ez használ egy programozási technika az úgynevezett rekurzív% értelmével. A rekurzió akkor jelentkezik, amikor egy eljárás nevezi magát, vagy más szóval, a rekurzív hívások is. A rekurzív algoritmust faktoriális azon a tényen alapul, hogy n! Ez egyenlő n * (n 1). Ez a módszer számítási klasszikus faktoriális Kim például rekurziót. Ebben az esetben ez a módszer nem különösebben tiven hatékonyságát, de a rekurzió számos fontos alkalmazásokhoz, és az intézkedéseket bizonyítja, hogy annak alkalmazása a Java teljesen legális. Ebben a példában is, ahelyett, adattípus int, amely egy 32 bites TSE LYM használt adattípus hosszú, ami egy 64 bites egész. Faktoriális gyorsan nagyon nagy, hogy a járulékos kapacitív ideig tart faktoros () metódus hasznosabb.

1.8 példa. Factorial2.java

* Ez az osztály bemutatja a rekurzív számítási módszere faktoriális. ezt

* Módszer nevezi magát többször, képlet alapján: n! = N * (n 1)! ** /

public class Factorial2

public static hosszú faktoros (hosszú x)

ha (x <0) throw new IllegalArgumentException("x должен быть>= 0 „);

ha (x <= 1) return 1; // Здесь рекурсия прекращается

else return x * faktoriális (x 1); // lépés rekurzió - hívja magát

Példa 1.9 bemutatja egy továbbfejlesztett változata az előző példákban, számítási faktoriális. Factorial - ideális jelöltek caching, mint a számítás megköveteli VRE Meni, és ami még fontosabb, akkor lehet számolni, nem annyira riál facto miatt korlátozott típusú adatok hosszú. Ezért, ha ezek az intézkedések egyszerre faktoriális kiszámítása, az ár-érték mentésre használatra duschego bója.

Eltekintve a bemutató gyorsítótár technika ebben a példában ez vezet Xia valami új. Először is, Factorial3 osztály cikkében meghatározott cal területén:

statikus hosszú [] táblázatban = új, hosszú [21];

static int utolsó = 0;

Elektrosztatikus mezők - egyfajta változó, megőrzése, azonban értékét hívások között módszer faktoros (). Ez azt jelenti, hogy az elektrosztatikus mezők tárolható kiszámított érték egyetlen hívással nye módszer használható egy másik hívják.

Másodszor, láthatjuk ebben a példában, hogyan lehet létrehozni tömbök:

statikus hosszú [] táblázatban = új, hosszú [21];

Az első felében az ebben a sorban (mielőtt jel =) kijelenti, egy statikus mező asztal, amely egy sor hosszú típusú értékek. A második emeleten ezen a vonalon 21 létrehoz egy sor típus értékeinek hosszú az új üzemben.

Végül, ez a példa azt mutatja, hogyan kell generálni kivételekkel:

dobja új IllegalArgumentException ( "túlcsordulás: x túl nagy.");

Kivételek - egyfajta Java objektumok. Ezek, valamint a tömb létre a kulcsszó új. Ha a program létrehoz egy kivétel objektumot a dobás nyilatkozatot, az azt jelenti, hogy nem volt hiba, vagy váratlan esemény. Ha van kivételekkel, a program a vezérlés átadódik a legközelebbi részén fogás szereplő try / catch. Ez a szakasz tartalmaznia kell a kód feldolgozására IP kapcsolás. Ha a kivétel nem fogott, pro gram végrehajtása megszakad egy hibaüzenettel.

Példa 1.9 van egy kivétel, a bejelentő a hívó eljárás eltelt az argumentum túl nagy vagy túl kicsi. Az argumentum túl nagy, ha ez nagyobb, mint 20, poskol ku, nem tudjuk kiszámítani faktoriális nagyobb, mint 20. Az érvelés túl kicsi, ha ez kevesebb, mint 0, mert a faktoriális meghatározása csak nem negatív egész. Hogyan, hogy elkapjam, és kezeli egy kivétel, akkor azt a következő példák ebben a fejezetben.

osztályokat használják a programot. Egyszer például, osztály java.math.BigInteger importált, akkor nem kell írni a nevét Noah emeleten; akkor nézze meg, hogy egyszerűen egy BigInteger. Azt mo zhete is importálhat egy csomagot osztályok felvenni a fájlt, például, a következő sort:

Vegye figyelembe, hogy java.lang csomag osztályok automatikusan importálja, mert tartozik a jelenlegi intézkedéscsomag, ami a mi esetünkben com.davidflanagan.examples.basics.

1.10 példa ugyanazt a gyorsítótár-készülékek, amelyek a legalább 1,9. Azonban, mivel sok a faktoriális, amely számolható, már nem korlátozódik a fenti, cache-nel Gia használatát egy sor rögzített mérettel. Ehelyett a példában a java.util.ArrayList - szolgáltatási osztály megvalósítása egy adatstruktúra, ilyen tömbök és képesek növekedni, hogy bármilyen méretű. Mivel ArrayList - egy objektum helyett tömeg Siv, amikor dolgozik szükséges alkalmazni módszerek, mint például a méret (), adjunk hozzá () és kap (). Hasonlóképpen BigInteger - ez egy tárgy, nem primitív értéket, ezért nem alkalmazható nyat szereplő szaporodnak tárgyak BigInteger *. Ehelyett többszörösen () módszerrel.

1.10 példa. Factorial4.java

// importálása osztályok fognak használni a programban.

// importáló az osztály voltunk, nem köteles a teljes nevét.

import java.math.BigInteger; // Import a BigInteger osztályt a csomag java.math import java.util * .; // Import minden osztály (beleértve ArrayList)

* Ez a verzió önkényesen nagy egész számokat

* Méretű, így a számított értékek nem korlátozódnak a fenti.

* Egy-gyorsítótár számított értékek esetén alkalmazható egy ArrayList

* Helyett fix méretű tömböket. ArrayList olyan, mint egy tömb,

* De nőhet, hogy bármilyen méretű. faktoros () metódus deklarált

* A «szinkronizált», így biztonságosan használható

* Több szálon programokat. Abban a vizsgálatban, ez az osztály megismerni

* A java.math.BigInteger és java.util.ArrayList. Munka Java verziók,

* Előző Java 1.2, használja vektor helyett ArrayList.

public class Factorial4

védett statikus ArrayList table = új ArrayList (); // Létrehozunk egy statikus gyorsítótár

/ ** faktoriális () módszer, amely felhasználja BigInteger tárolt objektumok ArrayList * /

public static szinkronizált BigInteger faktoriális (int x)

Kapcsolódó cikkek