potenssirekursio

Esko 24.03.08 10:56

Tehty esimerkiksi oheisen linkin keskustelun aloittajalle yksinkertainen potenssimetodi, jossa negatiiviset potenssit lasketaan rekursiolla. Tarkoitus olla havainnollinen, ei monimutkainen. Ja linkki: http://mureakuha.com/keskustelut/4?15700

 Tekstiversio  Arvo: 4 (8 ääntä)  Äänestä: +  -
/**
 * Tämä luokka on toteutettu täysin olio-ohjelmoinnin
 * periaatteiden mukaisesti. Pääidea on kuitenkin esitellä
 * rekursiota helposti ymmärrettävällä esimerkillä, yleensä
 * rekursiota demonstroidaan joko yksinkertaisella kertomalla
 * tai Fibonaccin lukusarjalla, kumpikin tosin vaatii hieman
 * ylimääräistä ajatteluvoimaa lukijalta, joten tässä vielä
 * yksi näkemys rekursioesimerkiksi.
 *
 * Kyseessä ei ole mitenkään monimutkainen ratkaisu tai edes
 * ongelma, mutta tämä onkin suunnattu nimenomaan
 * aloittelijoille, jotka tarvitsevat vielä yhden esimerkin,
 * jolla selittää rekursio itselleen.
 *
 * @author Esko Suomi
 *             (sukunimi PISTE etunimi AT gmail PISTE com)
 * @version 24.3.2008
 */

public class PotenssiRekursio {
       
        public void aja() {
                System.out.println("2^3: "+potenssi(2,3));
                System.out.println("2^0: "+potenssi(2,0));
                System.out.println("2^(-3): "+potenssi(2,-3));
                // tulostaa seuraavat kolme riviä:
                //2^3: 8.0
                //2^0: 1.0
                //2^(-3): 0.125
        }
       
        /**
         * Rekursiota hyödyntävä potenssimetodi.
         *
         * @param kanta korotettava luku
         * @param potenssi potenssi, jolla korotetaan
         * @return tulos
         */

        private double potenssi(double kanta, double potenssi) {
                double apu = 0;
                // potenssilaskun perustilanne:
                // esim. 2^3 = 2*2*2 = 8
                if(potenssi>0) {
                        // Ensimmäinen kertoma hoidetaan yksinkertaisella
                        // sijoituksella, jonka takia myös for-silmukan
                        // ehdossa on -1.
                        apu = kanta;
                        for(int i=0;i<(potenssi-1);i++) {
                                apu = apu*kanta;
                        }
                }
                // potenssin erikoistilanne, nollakerroin
                // x^0 = 1, tulos on aina 1
                else if(potenssi==0) {
                        return 1;
                }
                // negatiivisen potenssin käsittely,
                // esim. 2^(-3) = 1 / (2^3) = 0,125
                // Tässä tapauksessa käytössä rekursio, eli kutsutaan
                // samaa funktiota (Javassa siis metodia) uudelleen
                // nimittäjän selvittämiseksi. Potenssi kerrotaan
                // -1:llä, jotta negatiivinen luku saataisiin muutettua
                // positiiviseksi.
                else if(potenssi<0) {
                        apu = 1 / (potenssi(kanta, (-1*potenssi)));
                }
                return apu;
        }
       
        /**
         * Päämetodi, josta kaikki alkaa. Oikeaan tyyliin ohjelmoidessa
         * mainissa ei ole paljoa mitään sisältöä.
         *
         * @param args komentoriviltä kaapattavat parametrit
         */

        public static void main(String[] args) {
                PotenssiRekursio olio = new PotenssiRekursio();
                olio.aja();
        }
}

editoitu: 11:46 24.3.08
maka78 11:44 24.3.08 
Ihan ok esimerkki. Tuon
Java
(-1*potenssi)
etumerkin muunnoksen voisi toki tehdä suoraan näinkin
Java
-(potenssi) 
.
renni 00:11 27.4.08 
Tällä rivillä ainakin selvä bugi:
for(int i=0;i<(potenssi-1);i++) {
Esko 11:05 7.5.08 
Millainenhan bugi mahtaisi olla kyseessä? :)
Esko 10:14 9.5.08 
...ah, murtopotenssit vissiinkin? Mjoo, laskettakoon bugiksi.