Эффективный способ вычисления величайшего общего делителя из массива - 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