2013-07-03 11 views

Antwort

57

Hier ist eine rekursive Lösung.

var gcd = function(a, b) { 
    if (! b) { 
     return a; 
    } 

    return gcd(b, a % b); 
}; 

Unser Basisszenario ist, wenn b-0 gleich ist. In diesem Fall geben wir a zurück.

Wenn wir rekursiv sind, tauschen wir die Eingabeargumente aus, aber wir übergeben den Rest von a/b als zweites Argument.

+0

funktioniert gut, danke! – bboy

+2

rekursiv ist nicht der schnellste. –

+3

@FlorianF Okay, danke dafür. Ich habe verpasst, wo das OP um die schnellste Lösung gebeten hat. – alex

7
function egcd(a, b) { 
    if (a == 0) 
     return b; 

    while (b != 0) { 
     if (a > b) 
      a = a - b; 
     else 
      b = b - a; 
    } 

    return a; 
} 
14

Aus Wikipedia entnommen.

Rekursiv:

function gcd_rec(a, b) { 
    if (b) { 
     return gcd_rec(b, a % b); 
    } else { 
     return Math.abs(a); 
    } 
} 

Iterative:

function gcd(a,b) { 
    a = Math.abs(a); 
    b = Math.abs(b); 
    if (b > a) {var temp = a; a = b; b = temp;} 
    while (true) { 
     if (b == 0) return a; 
     a %= b; 
     if (a == 0) return b; 
     b %= a; 
    } 
} 
  • Edited pro Kommentar des Benutzers
+1

'if (a <0) a = -a;' Sie können auch mach 'a = Math.abs (a); '(gleich für die nächste Zeile) – user2428118

Verwandte Themen