user2989433
user2989433

Reputation: 53

Collatz sequence

How can I take an integer as input, of which the output will be the Collatz sequence following that number. This sequence is computed by the following rules:

e.g. when starting with 11

11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

This is my code now:

n = int(raw_input('insert a random number'))

while n > 1:
    if n%2 == 0:
        n_add = [n/2]
        collatz = [] + n_add
    else:
        n_add2 = [3*n + 1]
        collatz = [] + n_add2 
        print collatz

if I execute this and insert a number, nothing happens.

Upvotes: 1

Views: 1139

Answers (6)

#program

        def collatz(number):
            if number%2 == 0:
                return number//2
            elif number%2 == 1:
                return 3*number +1
        while True:
            integer = input()
            try:
                integer = int(integer)
            except ValueError:
                print("you must type an integer")
                continue
            a = collatz(integer)
            if a != 1:
                print(a)
            else:
                print(a)
                break

#output

    4
    2
    5
    16
    9
    28
    puppy
    you must type an integer
    4
    2
    2
    1

Upvotes: -1

Ashish
Ashish

Reputation: 1

Here is my Program:

def collatz(number):
    if number % 2 == 0:
        print(number//2)
        return number // 2
    elif number % 2 == 1:
        print(3*number+1)
        return 3*number+1
    else:
        print("Invalid number")
    
number = input("Please enter number: ")
while number != 1:
    number = collatz(int(number))`

And the output of this program:

Please enter number: 12
6
3
10
5
16
8
4
2
1

Upvotes: 0

RamRam
RamRam

Reputation: 1

I've also been working on it for a while now, and here's what I came up with:

def collatz (number): 
    while number != 1: 
        if number == 0: 
            break
        elif number == 2: 
            break
        elif number % 2 == 0: 
            number = number // 2 
            print (number) 
        elif number % 2 == 1: 
            number = 3 * number + 1 
            print (number)
    if number == 0: 
        print ("This isn't a positive integer. It doesn't count")
    elif number == 2: 
        print ("1")
        print ("Done!")
    elif number == 1: 
        print ("1")
        print ("Done!")

try:
    number = int(input("Please enter your number here and watch me do my magic: "))
except (ValueError, TypeError):
    print ("Please enter positive integers only")

try:
    collatz(number)
except (NameError):  
    print ("Can't perform operation without a valid input.")

Upvotes: 0

Ryan Hallberg
Ryan Hallberg

Reputation: 79

def collatz(number):
    while number != 1:
        if number % 2 == 0:
            number = number // 2
            print(number)

        elif number % 2 == 1:
            number = number * 3 + 1
            print(number)

try:
    num = int(input('Please pick any whole number to see the Collatz Sequence in action.\n'))
    collatz(num)
except ValueError:
    print('Please use whole numbers only.')

Upvotes: 0

Padraic Cunningham
Padraic Cunningham

Reputation: 180481

You should be modifying n each time, this will do what you want:

n = int(raw_input('insert a random number'))   
while n > 1:
    n = n / 2 if not n & 1 else 3 * n + 1 # if  last bit is not set to 1(number is odd) 
    print n

## -- End pasted text --
insert a random number11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Using your own code to just print out each n:

n = int(raw_input('insert a random number'))

while n > 1:
    if n % 2 == 0:
        n = n / 2
    else:
        n = 3 * n + 1
    print n

Or keep all in a list and print at the end:

all_seq = []
while n > 1:
    if n % 2 == 0:
        n = n / 2
    else:
        n = 3 * n + 1
    all_seq.append(n)
print(all_seq)

Upvotes: 1

AMADANON Inc.
AMADANON Inc.

Reputation: 5919

You are never changing the number n, so it will be the same each time round. You are also only printing if the number is odd. Also, square brackets [] indicate an array - I'm not sure what your goal is with this. I would probably rewrite it like this:

n = int(raw_input('insert a random number'))

while n > 1:
    if n%2 == 0:
        n = n/2
    else:
        n = 3*n + 1
    print n

You might want to take some time to compare and contrast what I'm doing with your instructions - it is almost literally a word-for-word translation (except for the print

It is a little unclear from your code if you want to just print them out as they come out, or if you want to collect them all, and print them out at the end.

Upvotes: 1

Related Questions