Сообщение от Demath
|
рекурсивно NOD(NOD(a,b),c)
|
Это хвостовая рекурсия, ее легко упразднить.
function NOD ( /* arguments */ ) {
return Array.prototype.reduce.call( arguments, function ( x, y ) {
while ( x && y ) {
x > y ? x %= y : y %= x;
}
return x + y;
});
}
alert([
NOD( 10, 15 ),
NOD( 111, 555, 407 ),
NOD( 100, 200, 300, 400, 2225, 175, 19873625 ),
NOD( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 )
].join( '\n' ));
Или более обратно совместимо
function NOD ( /* arguments */ ) {
for ( var x = arguments[ 0 ], i = 1; i < arguments.length; i++ ) {
var y = arguments[ i ];
while ( x && y ) {
x > y ? x %= y : y %= x;
}
x += y;
}
return x;
}
alert([
NOD( 10, 15 ),
NOD( 111, 555, 407 ),
NOD( 100, 200, 300, 400, 2225, 175, 19873625 ),
NOD( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 )
].join( '\n' ));
Второй вариант, по идее, должен работать быстрее.