View / copy raw utils.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from funcutils import proc_seq

def collatz(n):
    """The Collatz function

    >>> collatz(0)
    0
    >>> collatz(3)
    10
    >>> collatz(8)
    4
    >>> collatz(-8)
    -4
    """
    if n%2==0:
        return n//2     # // instead of / for an integer result
    else:
        return 3*n+1

def collatz_sequence(n):
    """Return the Collatz sequence seeded by n as a list.

    >>> collatz_sequence(1)
    [1]
    >>> collatz_sequence(8)
    [8, 4, 2, 1]
    """
    return proc_seq(n, collatz,  lambda x: x > 1, lambda state, x: state + [x], []) + [1]

def collatz_length(n):
    """The length of the Collatz sequence seeded by n (n and 1 are included)

    >>> collatz_length(8)
    4
    >>> collatz_length(3)
    8
    """
    return proc_seq(n, collatz, lambda x: x > 1, lambda state, x: state + 1, 1)