欧几里德算法伪代码转换为Swift?

Mat*_*ung 4 pseudocode ios swift

我一直在研究减少Swift中的分数的函数,并且遇到了欧几里德算法以找到最大公因子(http://en.wikipedia.org/wiki/Euclidean_algorithm)

我把伪代码转换成了swift,但是我很困惑,如果它返回a了我认为应该是分数的分子,这将给我一个最大的共同因素.任何有关这方面的帮助将不胜感激.谢谢!

伪代码:

function gcd(a, b)
    while b ? 0
       t := b
       b := a mod b
       a := t
     return a
Run Code Online (Sandbox Code Playgroud)

迅速:

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)")
Run Code Online (Sandbox Code Playgroud)

控制台输出: 2/4

das*_*ght 6

当你这样做

let b = a % b
Run Code Online (Sandbox Code Playgroud)

您正在创建另一个只读变量b,它与b外部作用域中的变量无关.你需要删除let循环中的两个s,并通过声明参数来修改参数var,如下所示:

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

你可以这样调用你的函数:

let a = 111
let b = 259
println("a=\(a), b=\(b), gcd=\(gcd(a,b))")
Run Code Online (Sandbox Code Playgroud)

这打印 a=111, b=259, gcd=37