Ein Freund hat mich herausgefordert, ein Programm zu schreiben, die (int a, int n, int k)
drei ganze Zahlen erhält und berechnet effizient wie möglich, a^n mod k
iterativ
ich kam mit dieser Lösung
public static int rec(int a,int n,int k) //calc a^n mod k
{
if(n == 1)
return a % k;
int exp1 = rec(a, n/2, k), exp2 = exp1;
if(n % 2 == 1)
exp2 = rec(a, n/2 + 1, k);
return (exp1 * exp2) % k;
}
Es ist eine unglaublich einfache rekursive Lösung, abhängig von der Tatsache, dass a^(b+c) mod d = (a^b mod d * a^c mod d) mod d
, und in logarithmischer Zeit läuft. Zumindest theoretisch.
In der Praxis, als wir unsere Lösung maßen, war seine lineare Zeitlösung besser als meine Lösung. Ich vermute, dass ich eher Rekursionen als Schleifen verwende. Ist das sinnvoll? Wenn ja - wie kann ich diesen Code in ein iteratives Programm umwandeln?
Java-Rekursion ist ** langsam **. In Java gibt es keine Tail-Recursion-Optimierung. Vermeiden Sie wie die Pest, wenn Sie Leistung wollen. –