Эффективный способ вычисления величайшего общего делителя из массива - Swift

Я создал следующую функцию, которая занимает два Integers В качестве параметров и вычисляет ГКД из них:

func getGCD(_ num1: Int, _ num2: Int) -> Int {

    let remainder = num1 % num2
    if remainder != 0 {
        return gcd(num2, remainder)
    } else {
        return num2
    }
}

ПРИМЕЧАНИЕ: я хочу использовать Recursivity,

Вопрос 1: Есть ли способ сделать эту функцию более эффективной?

Вопрос 2: Как я могу использовать эту функцию для Array типа [Int]?

2 ответа

Решение

Как только у вас есть функция gcd (или же getGCD) работает для двух целых чисел, следующее будет работать для массива arr целых чисел:

let result = arr.reduce(0) {gcd($0,$1)}

Прежде всего, ваша функция не работает для отрицательных Integersтаким образом, способ сделать это "более эффективным" состоит в том, чтобы использовать abs(), чтобы получить абсолютное значение чисел:

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

Второй вопрос - Работа с массивами:

var numbers = [5,10]
var index = 0
var result = 0
if numbers.isEmpty{result=0}
else if numbers.count == 1{result = numbers[0]}
else{
    while index <= numbers.count-1{
        if index==0{
            result = gcd(numbers[index], numbers[index + 1])
            index+=2
        }
        else {
            result = gcd(result,numbers[index])
            index+=1
        }
    }

}
print(result) // prints 5
Другие вопросы по тегам