potenz rekursion ohne multiplikation?!?!

Status
Nicht offen für weitere Antworten.

Unikate

Aktives Mitglied
hey,

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

Java:
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);
		}
	}
	
}
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
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

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

ich versteh halt nicht warum

Java:
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

Aktives Mitglied
Java:
 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

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

Unikate

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

Unikate

Aktives Mitglied
Java:
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?
 

Unikate

Aktives Mitglied
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

Gesperrter Benutzer
Da könntest du einfach die Multiplikation durch eine Iteration ersetzen, was anderes fällt mir nicht ein:
Java:
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;
}
 
S

SlaterB

Gast
Java:
    for (int i = 0; i < base; i++) {
        prod += pow(base, exp - 1);
    }
boah, wie unperformant, dabei doch so leicht in
Java:
    int irgendwas = pow(base, exp - 1);
    for (int i = 0; i < base; i++) {
        prod += irgendwas;
    }
umzuändern ;)

oder dann gleich sauber per Untermethode:
Java:
    return multiply(base, pow(base, exp - 1));
 

Unikate

Aktives Mitglied
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?

Java:
	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;
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
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

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

Was ist denn "int prod=0;"?
 

faetzminator

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

Das ist dein Code:
Java:
        int basis;
        int potenz;
        int ergebnis;
        int i;
        
        basis = 3;
        i=basis;
        potenz = 4;

Einfacher:
Java:
        int basis = 3;
        int potenz = 4;
        int ergebnis;
        int i = basis;
 

Unikate

Aktives Mitglied
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

Bekanntes Mitglied
"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? :)
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
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), ...
 
F

Flashgirl1987

Gast
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

Java:
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

Top Contributor
Das mit der Formatierung und dem Testen scheint außerordentlich schwierig zu sein :noe:
Java:
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;
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben