2013-02-15 3 views
-2

Все готово и отлично работает для моей программы. Мне пришлось написать рекурсивную функцию GCD. Однако я использовал две функции gcdRecursive и gcd. Могу ли я конденсировать этот код в одну функцию, поэтому мне не нужна функция gcd в моем коде ниже? Или мой код правильный, как есть, и обе функции необходимы.Является ли эта рекурсивная функция GCD правильной?

void gcdRecursive(int *x, int *y, int i){ 
    if (i >= 1) { 
    if (*x % i == 0 && *y % i == 0) { 
     printf("The GCD of %d and %d is %d", *x, *y, i); 
    } 
    else { 
     gcdRecursive(x, y, i - 1); 
    } 
    } 
} 
void gcd(int *x, int *y){ 
    getValuesForGCD(x, y); 
    gcdRecursive(x, y, *x); 
} 
+1

Вы 'Функция gcd' обертка посвящено взаимодействием с входной средой: вся работа происходит в 'gcdRecursive'. Он уже не нужен для вычисления наибольших общих делителей. Конечно, программы, как правило, нуждаются в некоторых способах ввода-вывода, чтобы быть полезными, но это не зависит от того, что вы делаете. – dmckee

+0

Пожалуйста, прекратите редактирование спама, чтобы ответить на вопрос. –

ответ

3

Да, это правильно, но это далеко не оптимально.

EDIT: попытаться использовать это:

if (x > y) 
    gcd(x,y) = gcd(y, x); 
if (y % x == 0) 
    gcd(x, y) = x; 
else 
    gcd(x, y) = gcd(x, y%x) 
+0

Как так .........? –

+0

Вы можете вычислить gcd рекурсивно в сторону меньших операций (вычислительный) –

+0

Как так .........? –

1

Более компактная форма может быть

int getGcd(int num1, int num2) 
{ 
    int remainder; 

    if(num2 != 0) 
     remainder = (num1 % num2); 
    return ((num2 == 0) ? num1: getGcd(num2, remainder)); 
} 
Смежные вопросы