diff --git a/maths/collatz_sequence.ts b/maths/collatz_sequence.ts new file mode 100644 index 00000000..fff660be --- /dev/null +++ b/maths/collatz_sequence.ts @@ -0,0 +1,36 @@ +/** + * Generates the Collatz sequence for a given positive integer. + * + * The Collatz conjecture sequence is defined as follows: + * - Start with any positive integer `n`. + * - If `n` is even, divide it by 2. + * - If `n` is odd, multiply it by 3 and add 1. + * - Repeat the process with the new value of `n` until `n` equals 1. + * + * @param n - A positive integer to generate the Collatz sequence. + * @throws {Error} - Throws an error if `n` is not a positive integer. + * @returns {number[]} - The Collatz sequence starting from `n`. + * + * @example + * collatzSequence(5); // Returns: [5, 16, 8, 4, 2, 1] + * collatzSequence(10); // Returns: [10, 5, 16, 8, 4, 2, 1] + */ +export const collatzSequence = (n: number): number[] => { + if (n <= 0 || !Number.isInteger(n)) { + throw new Error('Sequence only defined for positive integers.') + } + + const result: number[] = [] + + while (n !== 1) { + result.push(n) + if (n % 2 === 0) { + n /= 2 + } else { + n = n * 3 + 1 + } + } + + result.push(1) + return result +} diff --git a/maths/test/collatz_sequence.test.ts b/maths/test/collatz_sequence.test.ts new file mode 100644 index 00000000..2f65508e --- /dev/null +++ b/maths/test/collatz_sequence.test.ts @@ -0,0 +1,39 @@ +import { collatzSequence } from '../collatz_sequence' + +describe('collatzSequence', () => { + test('should generate the correct Collatz sequence for n = 5', () => { + const result = collatzSequence(5) + expect(result).toEqual([5, 16, 8, 4, 2, 1]) + }) + + test('should generate the correct Collatz sequence for n = 1', () => { + const result = collatzSequence(1) + expect(result).toEqual([1]) + }) + + test('should handle large inputs correctly (n = 27)', () => { + const result = collatzSequence(27) + // The exact sequence for n = 27 is very long; check key parts + expect(result[0]).toBe(27) + expect(result[result.length - 1]).toBe(1) + expect(result.length).toBeGreaterThan(100) + }) + + test('should throw an error for n = 0', () => { + expect(() => collatzSequence(0)).toThrow( + 'Sequence only defined for positive integers.' + ) + }) + + test('should throw an error for negative inputs (n = -5)', () => { + expect(() => collatzSequence(-5)).toThrow( + 'Sequence only defined for positive integers.' + ) + }) + + test('should throw an error for non-integer inputs (n = 5.5)', () => { + expect(() => collatzSequence(5.5)).toThrow( + 'Sequence only defined for positive integers.' + ) + }) +}) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy