# potenz rekursion ohne multiplikation?!?!



## Unikate (1. Dez 2009)

hey,

gibt es dafür ne formel?
multiplikation hab ich so dargestellt (das klappt bei einigen potenzen aber auch noch nicht!!!)!


```
public class Potenz_Rekursion {

	public static void main (String[]args){
		
		int basis;
		int potenz;
		int ergebnis;
		int ergebnis1;
		int i=1;
		int k=0;
		
		basis = In.readInt();
		potenz = In.readInt();
		
		ergebnis = multiplikation(basis,potenz,i);
		
		System.out.println("Multiplikation : " + ergebnis);
	}
	
	public static int multiplikation(int basis,int potenz, int i){
	
		if (potenz==1)
			return basis;
		else{
			i=basis*i;
			return i + multiplikation(basis,potenz - 1, i);
		}
	}
	
}
```


----------



## SlaterB (1. Dez 2009)

an Java-Tags denken

> das klappt bei einigen potenzen aber auch noch nicht!

gehts genauer oder soll jeder erst lange ausprobieren?
denke daran, dass int begrenzt ist
und verwende doch zum Testen einfacher

basis = 3;
        potenz = 4;

statt

basis = In.readInt();
        potenz = In.readInt();


----------



## Unikate (1. Dez 2009)

sorry für die tags, hab hier noch keinen quelltext gepostet.

ich versteh halt nicht warum 


```
public class Potenz_Rekursion {

	public static void main (String[]args){
		
		int basis;
		int potenz;
		int ergebnis;
		int i;
		
		basis = 3;
		i=basis;
		potenz = 4;
		
		ergebnis = multiplikation(basis,potenz,i);

		System.out.println("Multiplikation : " + ergebnis);

	}
	
	public static int multiplikation(int basis,int potenz, int i){
	
		if (potenz==1)
			return basis;
		else{
			i=basis*i;
			return i + multiplikation(basis,potenz - 1, i);
		}
	}
	
}
```

Mein Problem ist: wenn ich debugge kommt auch 81 raus , nur als ergebnis schreibt er 120. wieso??????


----------



## partsch (1. Dez 2009)

```
public static int multiplikation(int basis,int potenz, int i){
    
        if (potenz==1)
            return basis;
        else{
            i=basis*i;
            return i + multiplikation(basis,potenz - 1, i); // <--- gehört hier nicht ein *
            /* return i * multiplikation(basis,potenz - 1, i); */
        }
    }
```


----------



## Unikate (1. Dez 2009)

dann kommt ne riesen zahl raus!
also das rekursiv konzept hab ich schon verstanden. nur die anwendung ist immer so schwer!


----------



## Unikate (1. Dez 2009)

a ich weiß warum 120. er rechnet ja die einzelnen ergebnisse bei rekursion zurück, also 9+21+81+ basis


----------



## Unikate (1. Dez 2009)

```
public class Potenz_Rekursion {

	public static void main (String[]args){
		
		int basis;
		int potenz;
		int ergebnis;
		int i;
		
		basis = 3;
		i=basis;
		potenz = 4;
		
		ergebnis = multiplikation(basis,potenz);

		System.out.println("Multiplikation : " + ergebnis);

	}
	
	public static int multiplikation(int basis,int potenz){
		
		if (potenz==1)
			return basis;
		else{
			return basis * multiplikation(basis,potenz - 1);
		}
		}
	}
```

So funktioniert das ganze.

Hat jemand eine Idee, wie man Potenzen nur mit Subtraktion und Addition darstellt?


----------



## faetzminator (1. Dez 2009)

Naja, mir würde da nur gerade eine weitere Rekursion oder Iteration einfallen, aber willst du das?


----------



## Unikate (1. Dez 2009)

Gegeben sei ein sehr einfacher Taschenrechner, der nur die beiden Grundrechenoperationen (+, -) beherrscht.

Geben Sie für diesen Taschenrechner zwei Algorithmen zur Berechnung der Potenz an: zahl1zahl2.

Der eine Algorithmus soll rekursivals Struktogrammdargestellt sein.

Implementieren Sie den iterativen und rekursiven Algorithmus zum Potenzieren!

Das ist die Aufgabenstellung. Das bedeutet doch, ich darf keine Multiplikation verwenden oder?

dank dir


----------



## faetzminator (1. Dez 2009)

Da könntest du einfach die Multiplikation durch eine Iteration ersetzen, was anderes fällt mir nicht ein:

```
public static int pow(int base, int exp) {
	if (exp == 1) {
		return base;
	}
	int prod = 0;
	for (int i = 0; i < base; i++) {
		prod += pow(base, exp - 1);
	}
	return prod;
}
```


----------



## SlaterB (1. Dez 2009)

```
for (int i = 0; i < base; i++) {
        prod += pow(base, exp - 1);
    }
```
boah, wie unperformant, dabei doch so leicht in

```
int irgendwas = pow(base, exp - 1);
    for (int i = 0; i < base; i++) {
        prod += irgendwas;
    }
```
umzuändern 

oder dann gleich sauber per Untermethode:

```
return multiply(base, pow(base, exp - 1));
```


----------



## faetzminator (2. Dez 2009)

Da hast du natürlich recht


----------



## Unikate (2. Dez 2009)

genau das selbe hatte ich mir auch gedacht, nur hatte ich das problem , dass er mir immer gemeckert hatte , dass er kein return mehr hat, da ich das return in der for schleife drin hatte^^
danke

kann mir das jemand mal in worten beschreiben?


```
public static int addition(int basis, int potenz){
		
		if (potenz==1){
			return basis;
		}
		int prod=0;
		for (int i=0; i<basis; i++){
			prod += addition(basis, potenz - 1);
		}
			return prod;
```


----------



## faetzminator (2. Dez 2009)

Was willst du da in Worten beschrieben haben?
Warum heisst die Methode "addition" und nicht "potenz"?
Und du solltest noch SlaterB's Post berücksichtigen.


----------



## Unikate (2. Dez 2009)

sie heißt addition, weil ich noch eine methode multiplikation habe. damit ich die varianten unterscheiden kann!

Was ist denn "int prod=0;"?


----------



## faetzminator (3. Dez 2009)

Die Deklaration und Initialisierung der Variable [c]prod[/c] mit dem Wert [c]0[/c].

Das ist dein Code:

```
int basis;
        int potenz;
        int ergebnis;
        int i;
        
        basis = 3;
        i=basis;
        potenz = 4;
```

Einfacher:

```
int basis = 3;
        int potenz = 4;
        int ergebnis;
        int i = basis;
```


----------



## Unikate (3. Dez 2009)

wofür steht denn prod?ich weiß dass es eine variable mit dem startwert null ist 
nur was bezweckt das ganze?ich brauch ne richtige zusammenhängende erklärung!sonst raff ich das nicht! 

danke im voraus


----------



## w0ddes (3. Dez 2009)

"prod" steht in faetzminator's Code für das Produkt, also das Ergebnis der Multiplikation. (Man könnte sie natürlich auch "ergebnis" o.ä. nennen, damit würde sie halt die globale Variable "ergebnis" überlagern, weshalb faetzminator sich bestimmt für einen anderen namen entschieden hat)

-> "prod" wird am Ende der Methode "addition" zurückgegeben. 

Startwert 0 dürfte nun klar sein, oder?


----------



## faetzminator (3. Dez 2009)

Genau, ich habe [c]prod[/c] für _product_ verwendet. 1. Aus dem oben genannten Grund 2. Wie du siehst, schreibe ich alles in Englisch. Dafür gibt es viele Gründe... z.B. sind alle Klassen und Methoden der API sowieso englisch, get...() und set...() ist Standard (wäre eine Mischung von Deutsch und Englisch), ...


----------



## Flashgirl1987 (19. Jan 2012)

Hallo liebe Gemeinde 
Ich habe ein Problem und zwar spukt mir Java bei der Potenz mit Addition/Subtraktion ein falsches Ergebnis aus, die Zahl ist größer.

Kann mir vielleicht jemand sagen, wo da der FEhler ist ?

Danke schon mal 

LG, 
Flash


```
import java.io.*;
class potenz
{
public static void main (String[] args) throws IOException
{
BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in));
String input;
long zahl2;
long zahl1;
long erg;

System.out.println("Geben die Basis ein:");
input = stdin.readLine();
zahl1= Integer.parseInt( input );
System.out.println("Basis: " + zahl1  );


System.out.println("Geben die Exponent ein:");
input = stdin.readLine();
zahl2 = Integer.parseInt( input );
System.out.println("Exponent: "+ zahl2 );


long erg2=zahl2;


for (int i=1; i<zahl2;i++)
{
erg2=produkt(zahl1,erg2);
}
System.out.println("Ergebnis: "+ erg2 );
}




public static long produkt(long zahl1, long zahl2)
{	
	long erg;
	
	erg = 0;
if ( zahl2 > 0 ){
if( zahl1 > 0)
{
	while ( zahl1 > 0 )
{
	zahl1 = zahl1 - 1;
	erg = erg + zahl2;
}


}
else{
	
	while ( zahl1 < 0 )
{
	zahl1 = zahl1 + 1;
	erg = erg - zahl2;
	
}

}}



else{
	if( zahl1 > 0)
{while ( zahl1 > 0 )
{
	zahl1 = zahl1 - 1;
	erg = erg + zahl2;
}


}
else{
	while ( zahl1 < 0 )
{
	zahl1 = zahl1 + 1;
	erg = erg - zahl2;
}	

}
}
return erg;

}
}
```


----------



## Marco13 (19. Jan 2012)

Das mit der Formatierung und dem Testen scheint außerordentlich schwierig zu sein :noe:

```
import java.io.*;

public class Potenz
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        String input;
        long zahl2;
        long zahl1;
        long erg;

//        System.out.println("Geben die Basis ein:");
//        input = stdin.readLine();
//        zahl1 = Integer.parseInt(input);
//        System.out.println("Basis: " + zahl1);
//
//        System.out.println("Geben die Exponent ein:");
//        input = stdin.readLine();
//        zahl2 = Integer.parseInt(input);
//        System.out.println("Exponent: " + zahl2);

        zahl1 = 2;
        zahl2 = 3;
        
        long erg2 = zahl2;

        for (int i = 1; i < zahl2; i++)
        {
            erg2 = produkt(zahl1, erg2);
        }
        System.out.println("Ergebnis: " + erg2);
    }

    public static long produkt(long zahl1, long zahl2)
    {
        long erg;

        erg = 0;
        if (zahl2 > 0)
        {
            if (zahl1 > 0)
            {
                while (zahl1 > 0)
                {
                    zahl1 = zahl1 - 1;
                    erg = erg + zahl2;
                }

            }
            else
            {

                while (zahl1 < 0)
                {
                    zahl1 = zahl1 + 1;
                    erg = erg - zahl2;

                }

            }
        }

        else
        {
            if (zahl1 > 0)
            {
                while (zahl1 > 0)
                {
                    zahl1 = zahl1 - 1;
                    erg = erg + zahl2;
                }

            }
            else
            {
                while (zahl1 < 0)
                {
                    zahl1 = zahl1 + 1;
                    erg = erg - zahl2;
                }

            }
        }
        return erg;

    }
}
```


Er rechnet in diesem Beispiel das aus, was dort steht: Erst 2*3, das ergibt 6, und dann 2*6, das ergibt 12. Überleg' mal, was er stattdessen ausrechnen sollte. Tipp: Der Fehler liegt in der Zeile
long erg2 = zahl2;


----------

