Hallo Struppi,
Naja, ist zumindest in JS immer noch halb so langsam wie die Version mit split() und im Firefox nochmal langsamer wie charAt() Funktion, im IE sind beide relativ gleich.
Also mir ging es hier eher um eine allgemein saubere Lösung und darum, die einstellige Quersumme ohne Rekursion zu berechnen. Normalerweise sollte es auch schneller sein, direkt auf Zahlen zu rechnen, als dauernd zwischen Strings und Zahlen hin und her zu konvertieren. Um das zu konvertieren müssen ja schließlich die gleichen Rechenoperationen ausgeführt und zusätzlich noch ein String erzeugt werden.
Ich habe meinen Algorithmus jetzt auch mal kurz in JS implementiert und bin zu dem Ergebnis gekommen, dass meine Variante ungefähr doppelt so schnell ist, wie die Variante mit charAt.
Meine Implementierungen:
function impl1(n) {
summe = 0; while (n > 0) {
summe += n % 10;
n = Math.floor(n / 10);
if (summe > 10) {
summe -= 9
}
}
return summe;
}
function impl2(n) {
summe = 0;
n = "" + n;
for (var i = 0; i < n.length; i++) {
summe += parseInt(n.charAt(i));
if (summe > 10) {
summe -= 9;
}
}
return summe;
}
Getestet habe ich das im FF 1.5 (unter Linux)
Im Prinzip ist es natürlich denkbar, dass bei einer Scriptsprache wie JS es schneller ist, den Interpreter die Zahl in einen String konvertieren zu lassen. Wenn das so ist, liegt das aber daran, dass die Scriptsprache relativ langsam abgearbeitet wird und die Bibliotheksaufrufe dagegen sehr schnell (weil nicht in der Scriptsprache implementiert) sind. Dann kann es natürlich von Vorteil sein, möglichst wenig direkt in der Scriptsprache zu implementieren.
Wenn man die Quersumme aber sowieso nur für ein Beispiel berechnet und nicht mehrere Tausend mal, dann spielt das alles keine Rolle und man kann sich für den schönsten Algorithmus, sprich den, der nicht mit Strings rumbastelt, entscheiden ;-)
Grüße
Daniel