Skip to content

Commit 468db9a

Browse files
committed
feat: remove duplicated gcd-like functions
1 parent 0204198 commit 468db9a

File tree

3 files changed

+46
-53
lines changed

3 files changed

+46
-53
lines changed

Diff for: Maths/GetEuclidGCD.js

+23-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
function CheckInput(a, b) {
2+
if (typeof a !== 'number' || typeof b !== 'number') {
3+
throw new TypeError('Arguments must be numbers')
4+
}
5+
}
6+
17
/**
28
* GetEuclidGCD Euclidean algorithm to determine the GCD of two numbers
39
* @param {Number} a integer (may be negative)
410
* @param {Number} b integer (may be negative)
511
* @returns {Number} Greatest Common Divisor gcd(a, b)
612
*/
713
export function GetEuclidGCD(a, b) {
8-
if (typeof a !== 'number' || typeof b !== 'number') {
9-
throw new TypeError('Arguments must be numbers')
10-
}
14+
CheckInput(a, b)
1115
a = Math.abs(a)
1216
b = Math.abs(b)
1317
while (b !== 0) {
@@ -17,3 +21,19 @@ export function GetEuclidGCD(a, b) {
1721
}
1822
return a
1923
}
24+
25+
/**
26+
* Recursive version of GetEuclidGCD
27+
* @param {Number} a integer (may be negative)
28+
* @param {Number} b integer (may be negative)
29+
* @returns {Number} Greatest Common Divisor gcd(a, b)
30+
*/
31+
export function GetEuclidGCDRecursive(a, b) {
32+
CheckInput(a, b)
33+
a = Math.abs(a)
34+
b = Math.abs(b)
35+
if (b == 0) {
36+
return a
37+
}
38+
return GetEuclidGCDRecursive(b, a % b)
39+
}

Diff for: Maths/test/GetEuclidGCD.test.js

+23-20
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1-
import { GetEuclidGCD } from '../GetEuclidGCD'
1+
import { GetEuclidGCD, GetEuclidGCDRecursive } from '../GetEuclidGCD'
22

3-
describe('GetEuclidGCD', () => {
4-
it.each([
5-
[5, 20, 5],
6-
[109, 902, 1],
7-
[290, 780, 10],
8-
[104, 156, 52],
9-
[0, 100, 100],
10-
[-5, 50, 5],
11-
[0, 0, 0],
12-
[1, 1234567, 1]
13-
])('returns correct result for %i and %j', (inputA, inputB, expected) => {
14-
expect(GetEuclidGCD(inputA, inputB)).toBe(expected)
15-
expect(GetEuclidGCD(inputB, inputA)).toBe(expected)
16-
})
3+
describe.each([GetEuclidGCD, GetEuclidGCDRecursive])(
4+
'%# GetEuclidGCD',
5+
(gcdFunction) => {
6+
it.each([
7+
[5, 20, 5],
8+
[109, 902, 1],
9+
[290, 780, 10],
10+
[104, 156, 52],
11+
[0, 100, 100],
12+
[-5, 50, 5],
13+
[0, 0, 0],
14+
[1, 1234567, 1]
15+
])('returns correct result for %i and %j', (inputA, inputB, expected) => {
16+
expect(gcdFunction(inputA, inputB)).toBe(expected)
17+
expect(gcdFunction(inputB, inputA)).toBe(expected)
18+
})
1719

18-
it('should throw when any of the inputs is not a number', () => {
19-
expect(() => GetEuclidGCD('1', 2)).toThrowError()
20-
expect(() => GetEuclidGCD(1, '2')).toThrowError()
21-
})
22-
})
20+
it('should throw when any of the inputs is not a number', () => {
21+
expect(() => gcdFunction('1', 2)).toThrowError()
22+
expect(() => gcdFunction(1, '2')).toThrowError()
23+
})
24+
}
25+
)

Diff for: Recursive/EucledianGCD.js

-30
This file was deleted.

0 commit comments

Comments
 (0)