Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Berechenbarkeits- und Komplexitätstheorie » rekrusives potenzieren » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen rekrusives potenzieren
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Naja
Grünschnabel


Dabei seit: 25.01.2011
Beiträge: 2

rekrusives potenzieren Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hi Leute,

ich habe gerade dieses Forum hier entdeckt, eine gute Sache!

Ich habe eine Teilaufgabe die von mir verlangt, dass ich einen "besonders Effizienten" Algorithmus zur berechnung von x^n angebe. x ist reel und n eine natürliche Zahl.

Ein Hinweis auf das Funktionsprinzip soll sein: x^9=x*x^4*x^4
(ich hab das Gefühl, dass man sich diesen Hinweis an die Backe kleben kann..., naja, beide Potenzen sind eben gleich sowie eine Restpotenz? Bisher weiß ich noch nicht viel damit anzufangen)

Die eigendliche Teilaufgabe ist:

Entwickelt einen rekursive Algorithmus in JAVA, der die Potenz x^n möglichst effizient berechnet, das heißt die Laufzeit soll c*log(n) für eine natürliche Zahl c sein. Der Algorithmus darf keine Schleife enthalten und auch nicht Math.power verwenden. Beweist seine Laufzeit, d.h. insbesondere findet ein passendes c.

Hinweis: Um die Laufzeit zu bestimmen, zählt ihr die Anzahl der rekursiven Aufrufe des Algorithmus.





Meine Gedanken dazu:

ich kriege ein x und ich kriege ein n, also könnte ich, den Algorithmus:

public double Rechne(double x, int n)throws IllegalArgumentEcxeption{
if(n<0) throw new IllegalArgumentException("falsches n");

int p=0;
p++;

x=x*x;

if(p<=n) return Rechne(x,p);

}


was haltet ihr davon? ist richtig?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Naja: 25.01.2011 23:59.

25.01.2011 23:59 Naja ist offline Beiträge von Naja suchen Nehmen Sie Naja in Ihre Freundesliste auf
Naja
Grünschnabel


Dabei seit: 25.01.2011
Beiträge: 2

RE: rekrusives potenzieren Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

ich weiß nicht wie ich jetzt die laufzeit berechnen sollte, mit welcher schleifen invariante? oder doch ohne induktion? mich verwirrt das "rekursive"

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Naja: 26.01.2011 00:00.

26.01.2011 00:00 Naja ist offline Beiträge von Naja suchen Nehmen Sie Naja in Ihre Freundesliste auf
aal
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Hast du denn dein Beispiel getestet?

Ich habs etwas ausführlicher geschreiben( fürs beispiel 3^10):

public class ggg
{
int n=10;
int x=3;
int p=0;
int erg;

public void Rechne(){
if(n<0)
System.out.println("falsches n");
p++;
if(p==1)
{
erg=x;
}
else
{
erg*=x;

}

if(p<n)
{
Rechne();
}
else
System.out.println("Ergebnis:"+erg );

}



}

und zur Laufzeit:
Ich denke ,dass man hier die "Ablaufdauer" des Algortihmus berechnen muss..also wie lange das Programm braucht , um das Ergebnis zu liefern.

System.currentTimeMillis() das gibt die Aktielle zeit wieder. So könnte man Start und Endzeit bestimmen.
27.01.2011 19:43
stiba
unregistriert
Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
function pow(x,n) 
{  
 return n==0?1:n==1?x:n==2?x*x:(n%2==0)?pow(pow(x,n/2),2):x*pow(pow(x,(n-1)/2),2); 
}
22.05.2011 23:06
stiba
unregistriert
oder noch ein bisschen schöner... Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

code:
1:
2:
3:
4:
5:
6:
pow(Integer x,Integer n)
{
     return n==0?1:n==1?x:n==2?x*x:pow(pow(x,(n-n%2)/2),2)*(n%2==0?1:x);
}


Laufzeit:O(log(n))

@aal Die laufzeit eines algorithmus hat nicht auch nur das geringest mit der Ausführungsdauer zu tun! Es geht um die rechenschritte die der algorithmus braucht!

@naja deine Idee war zwar rekursiv, aber weit weg von einer effizienten!
Aber ist ja auch eh schon lang her, und die Klausur bestimmt bereits in der Hose? ;-)
Dein Algo hatte die laufzeit O(n)


puuhh was hab ich grad ne langeweile ;-)
24.05.2011 17:40
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Berechenbarkeits- und Komplexitätstheorie » rekrusives potenzieren