2017-02-04 4 views
1

ich die folgende Funktion erstellt haben, die zwei Integers als Parameter übernimmt und berechnet die GCD von ihnen:effiziente Art und Weise der größte gemeinsame Teiler von einem Array von Rechen - Swift

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

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

HINWEIS: Ich möchte Verwenden Sie Recursivity.

Frage 1: Gibt es eine Möglichkeit, diese Funktion effizienter zu machen?

Frage 2: Wie kann ich diese Funktion für eine Array des Typs [Int] verwenden?

+0

Dieser Ort soll Ihnen keine Lösung für Ihre Hausaufgaben geben – Simon

+0

Dies ist nur eine Algorithmusfrage. Sprache ist effektiv irrelevant. Gute Diskussion hier: http://stackoverflow.com/questions/16628088/euklidean-algorithm-gcd-with-multiple-numbers – matt

+0

Ihr Code funktioniert sowieso nicht, weil 'getGCD' und' gcd' zwei verschiedene Namen sind. – matt

Antwort

1

Sobald Sie eine Funktion haben gcd (oder getGCD) arbeitet für zwei ganze Zahlen sind, wird die folgende Arbeit für ein Array arr von ganzen Zahlen:

+0

Also meine, eigentlich. Das Problem liegt in deiner 'getGCD', die in der Form, die du auf jeden Fall gezeigt hast, total kaputt ist. – matt

+0

oh, ja Entschuldigung. Es ist meine Schuld. – Upgoat

+0

Nein, jetzt, da ich beide Antworten zweimal gelesen habe, ist es klar, dass deine Antwort besser ist, weil sie im Vergleich zu der anderen sehr effizient ist, und meine Funktion war sowieso durcheinander. Vielen Dank für Ihre Zeit! – Upgoat

1

Zu allererst Ihre Funktion funktioniert nicht für negative Integers, so eine Weise, sie „effizienter“ zu machen, ist abs() zu verwenden, den absoluten Wert der Zahlen zu erhalten:

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) 
    } 
} 

Zweite Frage - arbeiten mit Arrays:

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

Vielen Dank für die Verbesserung der Funktion! Allerdings habe ich Matts Antwort akzeptiert, da es viel effizienter ist. – Upgoat

Verwandte Themen