I'm trying to write a Collatz program using the guidelines from a project found at the end of chapter 3 of Automate the Boring Stuff with Python. I'm using python 3.4.0
. Following is the project outline:
Write a function named collatz()
that has one parameter named number. If the number is even, then collatz()
should print number // 2
and return this value. If the number is odd, then collatz()
should print and return 3 * number + 1
. Then write a program that lets the user type in an integer and that keeps calling collatz()
on that number until the function returns the value 1
.
The output of this program could look something like this:
Enter number: 3 10 5 16 8 4 2 1
I am trying to make a function that uses if
and elif
statements within a while loop. I want the number to print, and then return to the beginning of the loop and reduce itself to one using the Collatz sequence, with each instance of a resulting number being printed as it goes through the loop. With my current code, I'm only able to print the first instance of the number, and that number does not go through the loop after that. Following is my code:
#collatz print("enter a number:") try: number = (int(input())) except ValueError: print("Please enter a valid INTEGER.") def collatz(number): while number != 1: if number % 2==0: number = (number//2) #print(number) return (print(int(number))) elif nnumber % 2==1: number = (3*number+1) #print(number) return (print(int(number))) continue collatz(number)
My Algorithm The longest Collatz chain below five million contains 597 elements (and starts with 3732423). A brute-force algorithm solves this problem within a half a second. A smarter approach is to cache all chain lengths we encounter along the way.
The Collatz sequence, also called the Hailstone sequence, is a sequence of numbers relevant to the Collatz conjecture, which theorizes that any number using this algorithm will eventually be reduced to 1.
def collatz(number): if number % 2 == 0: print(number // 2) return number // 2 elif number % 2 == 1: result = 3 * number + 1 print(result) return result n = input("Give me a number: ") while n != 1: n = collatz(int(n))
Output:
Give me a number: 3 10 5 16 8 4 2 1 Give me a number: 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With