TheAlgorithms/Python · error · Exception

Sequence only defined for positive integers

Error message

Sequence only defined for positive integers

What it means

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.

Source

Thrown at maths/collatz_sequence.py:48

    Exception: Sequence only defined for positive integers
    >>> tuple(collatz_sequence(4))
    (4, 2, 1)
    >>> tuple(collatz_sequence(11))
    (11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1)
    >>> tuple(collatz_sequence(31))     # doctest: +NORMALIZE_WHITESPACE
    (31, 94, 47, 142, 71, 214, 107, 322, 161, 484, 242, 121, 364, 182, 91, 274, 137,
    412, 206, 103, 310, 155, 466, 233, 700, 350, 175, 526, 263, 790, 395, 1186, 593,
    1780, 890, 445, 1336, 668, 334, 167, 502, 251, 754, 377, 1132, 566, 283, 850, 425,
    1276, 638, 319, 958, 479, 1438, 719, 2158, 1079, 3238, 1619, 4858, 2429, 7288, 3644,
    1822, 911, 2734, 1367, 4102, 2051, 6154, 3077, 9232, 4616, 2308, 1154, 577, 1732,
    866, 433, 1300, 650, 325, 976, 488, 244, 122, 61, 184, 92, 46, 23, 70, 35, 106, 53,
    160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1)
    >>> tuple(collatz_sequence(43))     # doctest: +NORMALIZE_WHITESPACE
    (43, 130, 65, 196, 98, 49, 148, 74, 37, 112, 56, 28, 14, 7, 22, 11, 34, 17, 52, 26,
    13, 40, 20, 10, 5, 16, 8, 4, 2, 1)
    """
    if not isinstance(n, int) or n < 1:
        raise Exception("Sequence only defined for positive integers")

    yield n
    while n != 1:
        if n % 2 == 0:
            n //= 2
        else:
            n = 3 * n + 1
        yield n


def main():
    n = int(input("Your number: "))
    sequence = tuple(collatz_sequence(n))
    print(sequence)
    print(f"Collatz sequence from {n} took {len(sequence)} steps.")


if __name__ == "__main__":

View on GitHub (pinned to f5988cc097)

Solutions

  1. Coerce to int explicitly when the value is whole: collatz_sequence(int(n)) after verifying n == int(n).
  2. Validate n >= 1 and isinstance(n, int) at your own boundary with a clearer error message.
  3. Catch broad Exception (the code raises bare Exception, not ValueError) if you must handle it defensively.

Example fix

# before
n = input_number  # e.g. 7.0
for v in collatz_sequence(n): ...  # Exception

# after
if not isinstance(n, int) or isinstance(n, bool) or n < 1:
    raise ValueError('n must be a positive integer')
for v in collatz_sequence(int(n)):
    ...
Defensive patterns

Strategy: validation

Validate before calling

if not isinstance(n, int) or isinstance(n, bool) or n < 1:
    raise ValueError(f'n must be a positive integer, got {n!r}')

Type guard

def is_positive_int(n) -> bool:
    return isinstance(n, int) and not isinstance(n, bool) and n >= 1

Try / catch

try:
    seq = tuple(collatz_sequence(n))
except Exception as e:  # code raises bare Exception
    if 'positive integers' in str(e):
        raise ValueError(f'invalid seed {n!r} for collatz') from e
    raise

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14). Data as JSON: /api/errors/a7ac84a5555c8945. Report an issue: GitHub.