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
- 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.
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
- Coerce whole floats with int(n) after checking n == int(n).
- Remember this raises bare Exception, so catch Exception (not ValueError) defensively.
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
- Both points must have the same dimension.
- Monogons and Digons are not polygons in the Euclidean space
- All values must be greater than 0
- Undefined for non-integers
- Undefined for non-natural numbers
AI-assisted analysis of TheAlgorithms/Python@f5988cc097 (2026-08-14).
Data as JSON: /api/errors/a7ac84a5555c8945.
Report an issue: GitHub.