2017-02-04 10 views
1

я создал следующую функцию, которая принимает два Integers в качестве параметров и вычисляет НОД из них:Эффективный способ вычисления наибольшего общего делителя из массива - Swift

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]?

+0

Это место не предназначено для оказания вам вашей домашней работы – Simon

+0

Это вопрос с алгоритмом. Язык не имеет значения. Хорошее обсуждение здесь: http://stackoverflow.com/questions/16628088/euclidean-algorithm-gcd-with-multiple-numbers – matt

+0

Ваш код не работает, потому что 'getGCD' и' gcd' - это два разных имени. – matt

ответ

1

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

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

Так и делает. Проблема заключается в вашем 'getGCD', который полностью сломан в форме, которую вы показали в любом случае. – matt

+0

о, да извините. Это моя вина. – Upgoat

+0

Нет, теперь, когда я дважды читал оба ответа, ясно, что ваш ответ лучше, потому что он очень эффективен по сравнению с другим, и моя функция была перепутана. Спасибо за ваше время! – Upgoat

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 
+0

Благодарим вас за предложение улучшения функции! Тем не менее, я принял ответ Мэтта, потому что он более эффективен. – Upgoat

 Смежные вопросы

  • Нет связанных вопросов^_^