{"record":{"id":"a7ac84a5555c8945","repo":"TheAlgorithms/Python","slug":"sequence-only-defined-for-positive-integers","errorCode":null,"errorMessage":"Sequence only defined for positive integers","messagePattern":"Sequence only defined for positive integers","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"maths/collatz_sequence.py","lineNumber":48,"sourceCode":"    Exception: Sequence only defined for positive integers\n    >>> tuple(collatz_sequence(4))\n    (4, 2, 1)\n    >>> tuple(collatz_sequence(11))\n    (11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1)\n    >>> tuple(collatz_sequence(31))     # doctest: +NORMALIZE_WHITESPACE\n    (31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137,\n    412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593,\n    1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425,\n    1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,\n    1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,\n    866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53,\n    160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1)\n    >>> tuple(collatz_sequence(43))     # doctest: +NORMALIZE_WHITESPACE\n    (43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26,\n    13, 40, 20, 10, 5, 16, 8, 4, 2, 1)\n    \"\"\"\n    if not isinstance(n, int) or n < 1:\n        raise Exception(\"Sequence only defined for positive integers\")\n\n    yield n\n    while n != 1:\n        if n % 2 == 0:\n            n //= 2\n        else:\n            n = 3 * n + 1\n        yield n\n\n\ndef main():\n    n = int(input(\"Your number: \"))\n    sequence = tuple(collatz_sequence(n))\n    print(sequence)\n    print(f\"Collatz sequence from {n} took {len(sequence)} steps.\")\n\n\nif __name__ == \"__main__\":","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/TheAlgorithms/Python/blob/f5988cc09713315817df6a7e327e258013a94440/maths/collatz_sequence.py#L30-L66","documentation":"Raised by collatz_sequence() in maths/collatz_sequence.py when n is not an int or is less than 1. The Collatz iteration is only defined for positive integers (the 3n+1 / halve loop must stay in the integers and terminate at 1), so anything else — floats, strings, zero, negatives — is rejected with a bare Exception before the generator yields anything.","triggerScenarios":"Calling collatz_sequence(0), collatz_sequence(-5), collatz_sequence(2.0), or collatz_sequence('7'). The guard is not isinstance(n, int) or n < 1.","commonSituations":"Passing a float that happens to be whole (7.0 from division or JSON parsing); bool is an int subclass so True works but is almost always a bug when passed; n reaching 0 or negatives via user input; string input from input() not converted.","solutions":["Coerce to int explicitly when the value is whole: collatz_sequence(int(n)) after verifying n == int(n).","Validate n >= 1 and isinstance(n, int) at your own boundary with a clearer error message.","Catch broad Exception (the code raises bare Exception, not ValueError) if you must handle it defensively."],"exampleFix":"# before\nn = input_number  # e.g. 7.0\nfor v in collatz_sequence(n): ...  # Exception\n\n# after\nif not isinstance(n, int) or isinstance(n, bool) or n < 1:\n    raise ValueError('n must be a positive integer')\nfor v in collatz_sequence(int(n)):\n    ...","handlingStrategy":"validation","validationCode":"if not isinstance(n, int) or isinstance(n, bool) or n < 1:\n    raise ValueError(f'n must be a positive integer, got {n!r}')","typeGuard":"def is_positive_int(n) -> bool:\n    return isinstance(n, int) and not isinstance(n, bool) and n >= 1","tryCatchPattern":"try:\n    seq = tuple(collatz_sequence(n))\nexcept Exception as e:  # code raises bare Exception\n    if 'positive integers' in str(e):\n        raise ValueError(f'invalid seed {n!r} for collatz') from e\n    raise","preventionTips":["Coerce whole floats with int(n) after checking n == int(n).","Remember this raises bare Exception, so catch Exception (not ValueError) defensively."],"tags":["maths","collatz","generator","validation"],"backgroundTag":null,"analyzedSha":"f5988cc09713315817df6a7e327e258013a94440","analyzedAt":"2026-08-14T17:30:07.041Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}