Potenz mithilfe rekursiver Funktion

moccajoghurt

Bekanntes Mitglied
Ich scheitere bei einer Aufgabe meines Java-Kurses, bei der es darum geht eine rekursive Funktion zu erstellen, die die Potenz einer Zahl berechnet. Hier nochmal die Aufgabenstellung:

Implementieren Sie in Java eine rekursive Funktion
public static double potenz(double zahl, int pot)
die die pot-te Potenz von zahl berechnet. Der Wert von pot kann auch negativ sein!. Schreiben Sie ein kleines Programm, das die Funktion testet.
Beispiele.:
potenz(2.0, 3) == 8
potenz(2.0, -3) == 0.125


Leider habe ich das Prinzip noch nicht verstanden, mit dem rekursive Funktionen Werte ausgeben. Bitte um Hilfe :)
 

XHelp

Top Contributor
die Funktion für positive potenzen könnte wie folgt aussehen:
Java:
public static double potenz(double zahl, int pot) {
  if (pot==1) {
    return zahl;
  } else {
    return zahl*potenz(zahl,pot-1);
  }
}

Für negative Potenzen musst du es noch umschreiben.
x^-n = 1/x^n
 
A

Altintop

Gast
Zwar was älter dieser Thread, aber ich habe ein gutes Beispiel hier:

// Gibt "n hoch m" aus für n und m ganze Zahlen (REKURSIV)
public static double potRec(int n, int m)
{
if(m < 0)
return 1 / potRec(n, -m); // Rückgabetyp double !!!

if(m == 0) // Abbruchsbedingung und Standardwert
return 1;

return n * potRec(n, m-1); // Rekursionsvorschrift anwenden
}
 

bandy

Bekanntes Mitglied
Ich scheitere bei einer Aufgabe meines Java-Kurses, bei der es darum geht eine rekursive Funktion zu erstellen, die die Potenz einer Zahl berechnet. Hier nochmal die Aufgabenstellung:

Implementieren Sie in Java eine rekursive Funktion
public static double potenz(double zahl, int pot)
die die pot-te Potenz von zahl berechnet. Der Wert von pot kann auch negativ sein!. Schreiben Sie ein kleines Programm, das die Funktion testet.
Beispiele.:
potenz(2.0, 3) == 8
potenz(2.0, -3) == 0.125


Leider habe ich das Prinzip noch nicht verstanden, mit dem rekursive Funktionen Werte ausgeben. Bitte um Hilfe :)


Hallo,

so kannst du jede Potenz jeder Zahl ausrechnen:

Java:
public class Potenzberechnen {
	
private double potenzBerechnen(double zahl, int potenz){
	
	double ergebnis= Math.pow(zahl, potenz);
	System.out.print(ergebnis);
	
	return ergebnis;	
}
	public static void main(String[] args) {
	Potenzberechnen P= new Potenzberechnen();
        P.potenzBerechnen(2, 3);    
	}
}
 

dehlen

Bekanntes Mitglied
Hallo,

so kannst du jede Potenz jeder Zahl ausrechnen:

Java:
public class Potenzberechnen {
	
private double potenzBerechnen(double zahl, int potenz){
	
	double ergebnis= Math.pow(zahl, potenz);
	System.out.print(ergebnis);
	
	return ergebnis;	
}
	public static void main(String[] args) {
	Potenzberechnen P= new Potenzberechnen();
        P.potenzBerechnen(2, 3);    
	}
}

ist aber nicht rekursiv wie vom TO vorgegeben
 

0x7F800000

Top Contributor
die Funktion für positive potenzen könnte wie folgt aussehen:
Java:
public static double potenz(double zahl, int pot) {
  if (pot==1) {
    return zahl;
  } else {
    return zahl*potenz(zahl,pot-1);
  }
}
Dieser Berechnungsvorschrift liegt die Beobachtung
Code:
a^n = a * a^(n-1)
zugrunde, das ist linear in n, was für große n schlecht ist.

Etwas besser:
Java:
import static java.lang.System.*;

public class Power {

	public static double pow(double d, int n){
		if (n < 0){
			return pow(1/d, -n); 
		}else if (n == 0){
			return 1;
		}else{
			double sqrt = pow(d, n/2);
			if (n % 2 == 0){
				return sqrt*sqrt;
			}else{
				return sqrt*sqrt * d;
			}
		}
	}
	
	public static void main(String[] args){
		out.println(pow(2, 3));
		out.println(pow(2, -3));
	}
}
bzw.
Code:
a^n = (a^(n/2))^2 für n gerade
a^n = a*(a^floor(n/2))^2 für n gerade
Hier wird die Potenz jedes mal halbiert, deshalb läuft's in O(lg(n)), was für fürchterlich große n (wie in Kryptographie benötigt) wichtig ist.
 

bandy

Bekanntes Mitglied
ist aber nicht rekursiv wie vom TO vorgegeben

Wieso? Rekursiver Aufruf liegt doch dann vor, wenn eine Methode durch eine andere aufgerufen wird, oder? Wenn ich in meiner Methode die Methode

Java:
pow()

der Klasse

Java:
Math

aufrufe, dann ist es doch rekursiv?:bahnhof:
 

Dekker

Bekanntes Mitglied
Nein...

Rekursion bedeutet, dass sich eine Funktion selbst wieder aufruft um ein Problem zu lösen. Dabei wird meißt versucht ein großes Problem zu lösen in dem man es in kleinere Probleme aufteilt, bis sie so klein sind, dass man sie einfach berechnen kann. Mithilfe der Teillösungen kommt man dann zu Gesamtlösung. Dieser Ansatz wird z.B. auch Divide and Conquer genannt. Ein berühmter Algorithmus der nach diesem Prinzip vorgeht ist der Quicksort.

Das hier wäre Rekursion:

Java:
public int foo(int n){
  if(n<=0) // Das hier ist der sogenannte Rekursionsanker
      return 0;
  else
      return n+foo(n-1); // Rekursiver aufruf. foo(n) ruft also foo(n-1) auf -> Problem wurde verkleinert
}

Dabei sei angemerkt, das die Funktion foo nichts sinvolles macht, es soll einfach nur zeigen wie eine Rekursion im Prinzip funktioniert / aussehen kann.
 
A

Altintop

Gast
Ups, bin hier nicht registriert, aber wie gut, dass man auch als Gast posten kann.

Potenzieren - REKURSIV:

Java:
        public static double potRec(int n, int m) 
	{
		if(m < 0)
			return 1 / potRec(n, -m); // Rückgabetyp double !!!
		
		if(m == 0) // Abbruchsbedingung, Startwert
			return 1;
		
		return n * potRec(n, m-1); // Rekursionsvorschrift anwenden
	}
______

Potenzieren - ITERATIV:

Java:
         public static double potIt(int n, int m) 
	{
		double tmp = 1; // Zwischenspeicher
		
		if (m == 0) // Anfangsbedingung für Potenzen 
			return tmp;
		
		if (m < 0)
			for (int i = 1; i <= -m; i++)
				tmp /= n;
		
		if (m > 0)
			for (int i = 1; i <= m; i++)
				tmp *= n;
		
		return tmp;
	}
___

Sonstige Funktionen, wo man die Unterschiede zwischen Iteration und Rekursion darstellen kann:

Java:
	// Gibt die Fakultät von n zurück, (REKURSIV)
	public static int facRec(int n)
	{
		if (n < 0) // Fehlerausgabe
			return -99;
		
		if (n == 0) // Anfangsbedingung für Fakultät
			return 1;
		else
			return n * facRec(n-1); // Rekursionsvorschrift anwenden
	}

Java:
        //Gibt die Fakultät von n zurück (ITERATIV)
	public static int facIt(int n)
	{
		if (n < 0) // Fehlerausgabe
			return -99;
		
		int tmp = 1; // Zwischenspeicher
		
		if (n == 0) // Anfangsbedingung für Fakultät
			return tmp;
		
		for (int i = 1; i <= n; i++)
			tmp *= i;
		
		return tmp;
	}
___

Binäre Suche:

Java:
       public static int binSearchRec(int[] a, int l, int r, int key)
       {
		int m = (l+r)/2;
		
		if (l > r )
			return -100;
		
		if (a[m] == key)
			return m;
		
                if (a[m] < key)
			return binSearchRec(a,m+1,r,key);
		else
			return binSearchRec(a,l,m-1,key);
		
	}

Java:
        // Gibt die n-te Fibonacci-Zahl zurück, REKURSIV
	public static int fibRec(int n)
	{
		if (n == 0)  // Anfangswert F(0) = 0
			return 0;
		if (n == 1)  // Anfangswert F(1) = 1
			return 1;
		
		return fibRec(n-1) + fibRec(n-2); // Rekursionsvorschrift anwenden
	}

Java:
        // Gibt die n-te Fib-Zahl zurück, ITERATIV
        public static int fibIt(int n)
	{
		int[] fib = new int[n+1];
		fib[0] = 0;
		fib[1] = 1;
		
		for (int i = 2; i <= n; i++){
			fib[i] = fib[i-1] + fib[i-2]; 
		}
		return fib[n];
	}

Denke das sind genug Beispiele :)
 

hdi

Top Contributor
Dabei sei angemerkt, das die Funktion foo nichts sinvolles macht, es soll einfach nur zeigen wie eine Rekursion im Prinzip funktioniert / aussehen kann
Naja, es ist die Summenfunktion, erzähl mal nem Mathematiker dass die nichts sinnvolles macht ;)
 

0x7F800000

Top Contributor
Eine effiziente Lösung und eine Lösung, die man gut nachvollziehen kann sind meistens nicht die selben Lösungen
Gilt für 99.999% der Fälle, jo. [c]a^n = (a^(n/2))^2[/c] kann aber jeder ab der Achten Klasse nachvollziehen, deswegen ist es in diesem Fall irrelevant: keiner fragt den ja nach einer Laufzeitanalyse.

Deine Ausführung hat leider einen Haken: In der Kryptografie würde man nicht mit double rechnen. :bae:
Genauso wie man für double keine rekursive Potenzfunktionen programmieren würde, weil das mit der FPU hundert mal schneller geht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Potenz berechnen mit for-Schleife Java Basics - Anfänger-Themen 3
F Potenz ausrechnen Hilfe! Java Basics - Anfänger-Themen 7
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
A DecimalFormat und wissenschatliche (Potenz-)Schreibweise Java Basics - Anfänger-Themen 6
A mantisse var * 10 hoch potenz var Java Basics - Anfänger-Themen 2
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
C Gleichung mit Potenz mit einer Unbekannten lösen Java Basics - Anfänger-Themen 5
R 2er Potenz mit vorgegebenem Schema Java Basics - Anfänger-Themen 5
W Potenz Java Basics - Anfänger-Themen 6
J Methoden Rekursive Potenz ohne Math.Pow() Java Basics - Anfänger-Themen 9
M Potenz berechnen Java Basics - Anfänger-Themen 3
P Usereingabe und Potenz berechnen Java Basics - Anfänger-Themen 16
2 2er Potenz berechnen Java Basics - Anfänger-Themen 17
K Potenz mit Summer der ungeraden Zahlen Java Basics - Anfänger-Themen 14
E Potenz mit Modulo (über for-Schleife) berechnen Java Basics - Anfänger-Themen 8
Haubitze_Broese Potenz einer Zahl, der Exponent ist dabei eine beliebige ganze Zahl? Java Basics - Anfänger-Themen 10
J programm für kleinste potenz Java Basics - Anfänger-Themen 10
G Potenz in Java Java Basics - Anfänger-Themen 20
Thomas06 Wie kann man mithilfe von boolean herausfinden ob eine zahl durch 5 und 7 teilbart ist ? Java Basics - Anfänger-Themen 7
E Zinsrechnung mithilfe von Arrays Java Basics - Anfänger-Themen 12
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
Poppigescorn Mithilfe einer Arrayliste einen Notenspiegel ausgeben Java Basics - Anfänger-Themen 12
L Queue mithilfe von 2 Stacks erstellen Java Basics - Anfänger-Themen 1
B Erste Schritte Histogramm mithilfe 2-dimensionaler Arrays Java Basics - Anfänger-Themen 4
J eine Art Histogramm mithilfe eines Arrays ausgeben Java Basics - Anfänger-Themen 11
J Interface Einlesen von Bildern mithilfe von URL zu langsam Java Basics - Anfänger-Themen 5
C Umrisse von Bilddateien mithilfe Polygonen zeichnen Java Basics - Anfänger-Themen 5
S Gespeichertes aus ArrayList laden mithilfe der For-Schleife Java Basics - Anfänger-Themen 12
S Double mithilfe eines Scanners so einlesen, dass ich damit rechnen kann Java Basics - Anfänger-Themen 4
G Probleme mit Zahlenfilter bei Texteingabe mithilfe String matches Java Basics - Anfänger-Themen 4
J Pi berechnen mithilfe Kettenbruch von Lambert Java Basics - Anfänger-Themen 2
R Drucken mithilfe eines Externen ActionListeners Java Basics - Anfänger-Themen 17
1 Berechnung von PI mithilfe von Buffons Nadelproblem Java Basics - Anfänger-Themen 2
M Variablenname mithilfe einer schleife erstellen? Java Basics - Anfänger-Themen 2
E einzelne Zeile mithilfe Steams aus Textdatei überschreiben Java Basics - Anfänger-Themen 23
E Verschlüsselung mithilfe von Array Java Basics - Anfänger-Themen 2
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
M Probleme bei rekursiver Zuordnung Java Basics - Anfänger-Themen 1
H Rekursiver Aufruf Java Basics - Anfänger-Themen 8
S Rekursiver InsertionSort ohne Schleife Java Basics - Anfänger-Themen 7
K Methoden Fibonacci in Array mit rekursiver Methoden Java Basics - Anfänger-Themen 19
4 Stack over flow bei rekursiver Tiefensuche Java Basics - Anfänger-Themen 5
T Rekursiver Methodenaufruf funktioniert nicht Java Basics - Anfänger-Themen 7
O Rekursiver Durchlauf verschachtelter Elemente Java Basics - Anfänger-Themen 1
B Quadratwurzel nach Heron in rekursiver Darstellung Java Basics - Anfänger-Themen 1
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
W sysout in rekursiver methode Java Basics - Anfänger-Themen 4
A Rekursiver Pseudocode Java Basics - Anfänger-Themen 4
E Problem bei rekursiver Berechnung des Binomialkoeffizienten Java Basics - Anfänger-Themen 5
S Probleme bei Ausgabe von rekursiver Methode (List) Java Basics - Anfänger-Themen 16
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
D Binäre Suche für Integerarray in rekursiver Funktion Java Basics - Anfänger-Themen 5
O Faktorielle mit rekursiver Methode berechnen Java Basics - Anfänger-Themen 6
S Laufzeit bei rekursiver Methode messen Java Basics - Anfänger-Themen 6
N Unerklärlich: Rekursiver Algorithmus gibt falschen Datentyp zurück... Java Basics - Anfänger-Themen 4
J rekursiver Methodenaufruf Java Basics - Anfänger-Themen 12
D Datentypen Rekursiver Datentyp Java Basics - Anfänger-Themen 8
S Werte von rekursiver Methode Java Basics - Anfänger-Themen 5
Q rekursiver algo. Java Basics - Anfänger-Themen 16
F Rekursiver Algorithmus Java Basics - Anfänger-Themen 5
C Frage zu negativen und positiven Exponenten in rekursiver Methode Java Basics - Anfänger-Themen 11
G Rekursiver Aufruf einer JSP über eine JavaScript-Funktion Java Basics - Anfänger-Themen 5
G PRoblem mit rekursiver float additions methode Java Basics - Anfänger-Themen 9
B rekursiver Funktionsaufruf Java Basics - Anfänger-Themen 2
E fehlermeldung bei rekursiver grafik Java Basics - Anfänger-Themen 11
F Problem bei rekursiver Binärsuche Java Basics - Anfänger-Themen 2
T Rekursiver Algorithmus: Türme von Hanoi Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben