Рекурсивные и итерационные алгоритмы Евклида


Этот код слишком загадочно? Просто да или нет вопрос. Обратная связь является обязательным.

int recursive_euclidean( int num1, int num2 )
{
    int gcd=0;
    if( num1 == num2 || num1 < 0 || num2 < 0 ) 
        ( ( num1 == num2 ) ? ( gcd = num1 ) : ( ( num1 < 0) ? ( gcd = num2 ) : 
            ( gcd = num1 ) ) );
    else
        ( ( num1 > num2 ) ? ( gcd = recursive_euclidean( num1-num2, num2 ) ) :
            ( gcd = recursive_euclidean( num1, num2-num1 ) ) );
    return gcd;
}

int iterative_euclidean( int num1, int num2 )
{
    while( num1 != num2 && num1 > 0 && num2 > 0 )
       (( num1 > num2 ) ? (num1-=num2) : (num2-=num1) );
    return (num1>0) ? num1 : num2;
}


1501
17
задан 8 августа 2011 в 06:08 Источник Поделиться
Комментарии
4 ответа

Мне не нравится несколько разных заданий внутри оператора.
Они сейчас всем назначают для НОД , но вы должны изучить его в деталях, чтобы разобраться с этим.
Я бы сделал явные уступки и тернарный оператор возвращает правильное значение.

Другое дело с тернарный оператор является то, что они не прост для чтения. Так что используйте пробел, чтобы попробовать и сделать его очевидным, что это происходит. Также я предпочитаю, чтобы явно использовать ' { '' }', чтобы убедиться, что все не случайно ассоциируется с другим заявлением. Я хотел выложить это:

int recursive_euclidean( int num1, int num2 )
{
int gcd;

if( num1 == num2 || num1 < 0 || num2 < 0 )
{
gcd = (num1 == num2)
? num1
: (num1 < 0)
? num2
: num1;
}
else
{
gcd = (num1 > num2)
? recursive_euclidean( num1-num2, num2 )
: recursive_euclidean( num1, num2-num1 );
}
return gcd;
}

На самом деле читать это, я бы рефакторинг это:

int recursive_euclidean( int num1, int num2 )
{
int gcd;

if ( num1 == num2)
{ gcd = num1;
}
else if (num1 < 0)
{ gcd = num2;
}
else if (num2 < 0)
{ gcd = num1;
}
else
{
gcd = (num1 > num2)
? recursive_euclidean( num1-num2, num2 )
: recursive_euclidean( num1, num2-num1 );
}
return gcd;
}

Вот тогда, я лично не хотел бы использовать тернарный оператор.

int iterative_euclidean( int num1, int num2 )
{
while( num1 != num2 && num1 > 0 && num2 > 0 )
{
if (num1 > num2 )
{ num1-=num2;}
else{ num2-=num1;}
}
return (num1>0) ? num1 : num2;
}

21
ответ дан 8 августа 2011 в 07:08 Источник Поделиться

Почему вы используете || между трех условий только потом принять решение об условиях отдельно? Почему бы тебе не написать это так:

int recursive_euclidean( int num1, int num2 )
{
if( num1 == num2 )
return num1;
else if( num1 < 0 )
return num2;
else if( num2 < 0)
return num1;
else if( num1 > num2)
return gcd = recursive_euclidean( num1-num2, num2 ) ) :
else
return recursive_euclidean( num1, num2-num1 ) ) );
}

Настоящим я запретить использование тернарного оператора из-за вопиющих злоупотреблений. Не серьезно, но не понятно, почему вы пытаетесь привести его сюда.

18
ответ дан 9 августа 2011 в 06:08 Источник Поделиться

Я думаю, что простой тест будет иметь посторонний прочитать код и понять что он делает. Я так и сделала, и прекрасно читается для меня. На самом деле, я считаю, что это идеальное сочетание читабельности и компактности.

0
ответ дан 8 августа 2011 в 08:08 Источник Поделиться

Мне просто нравится этот:

int recursive_euclidean( int num1, int num2 )
{
return num1 == num2 ? num1
: num1 < 0 ? num2
: num2 < 0 ? num1
: num1 > num2 ? recursive_euclidean( num1-num2, num2 )
: recursive_euclidean( num1, num2-num1 );
}

0
ответ дан 4 апреля 2013 в 06:04 Источник Поделиться