¿Conversión de pseudocódigo del algorithm euclidiano a Swift?

He estado trabajando en una function para networkingucir fracciones en Swift, y encontré el algorithm euclidiano para encontrar el mayor factor común ( http://en.wikipedia.org/wiki/Euclidean_algorithm )

Convertí el pseudocódigo en veloz, pero aún estoy confundido cómo esto me va a dar el mayor factor común si está devolviendo a que creía que debía ser el numerador de la fracción. Cualquier ayuda en esto sería muy apreciada. ¡Gracias!

Pseudocódigo:

 function gcd(a, b) while b ≠ 0 t := b b := a mod b a := t return a 

Rápido:

 var a = 2 var b = 4 func gcd(a: Int, b: Int) -> Int { var t = 0 while b != 0 { t = b let b = a % b let a = t } return a } println("\(a)/\(b)") 

Salida de la console: 2/4

Cuando haces esto

 let b = a % b 

está creando otra variable b readonly, que no tiene nada que ver con la variable b del ámbito externo. Debe eliminar ambos let 's dentro del bucle, y hacer que los parameters sean modificables al declararlos con var , así:

 func gcd(var a: Int, var b: Int) -> Int { var t = 0 while b != 0 { t = b b = a % b a = t } return a } 

Puedes llamar a tu function así:

 let a = 111 let b = 259 println("a=\(a), b=\(b), gcd=\(gcd(a,b))") 

Esto imprime a=111, b=259, gcd=37

Tomando la respuesta de @ dasblinkenlight y eliminando t mediante el uso de tuplas para performances de asignación paralela:

Swift 2.1:

 func gcd(var a: Int, var _ b: Int) -> Int { while b != 0 { (a, b) = (b, a % b) } return a } gcd(1001, 39) // 13 

var parameters var están en desuso en Swift 2.2 y se eliminarán en Swift 3 . Entonces, ahora es necesario declarar a y b como var dentro de la function:

 func gcd(a: Int, _ b: Int) -> Int { var (a, b) = (a, b) while b != 0 { (a, b) = (b, a % b) } return a } 

Puede usar un método recursivo que simplemente se sigue llamando hasta que se encuentre el GCD.

 func gcd(a: Int, b: Int) -> Int { if b == 0 { return a } let remainder: Int = a % b return gcd(b, b: remainder) } 

y utilízalo así

 let gcdOfSomeNums = gcd(28851538, b: 1183019) //gcdOfSomeNums is 17657 

Versión de respuesta Swift 3 dada por Christopher Larsen

 func gcd(a: Int, b: Int) -> Int { if b == 0 { return a } return gcd(a: b, b: a % b) }