Is there a way to use list comprehension’s to workout Collatz conjecture without using a while statement or another method to append the n value to the ls without adding ls after each statement?
from random import choice
from time import sleep
n = choice([x for x in range(2, 99*99) if all(x%y != 0 for y in range(2, x))])
ls = []
ls.append(n)
while True:
if n % 2 == 0:
n = n // 2
ls.append(n)
elif n % 2 != 0:
n = (3 * n) + 1
ls.append(n)
if n == 1:
break
print(ls)
>Solution :
Well while is what you use when you don’t know yet how many steps it will take and since that is kind of baked into the logic of finding the conjecture for a value there is not really a way around it. I personally think there is nothing bad about using while loops.
You can still make the code a bit more compact and readable while keeping the while loop, e.g. like this:
from random import choice
n = choice([x for x in range(2, 99 * 99) if all(x % y != 0 for y in range(2, x))])
ls = [n]
while n != 1:
n = n // 2 if n % 2 == 0 else (3 * n) + 1
ls.append(n)
print(ls)
Edit:
A slightly modified version of @Kelly Bundys answer does the trick for me to make it even more compact (let’s not mention the readability though):
from random import choice
n = choice([x for x in range(2, 99 * 99) if all(x % y != 0 for y in range(2, x))])
ls = [n] + [n := n // 2 if n % 2 == 0 else (3 * n) + 1 for _ in iter(lambda: n, 1)]
print(ls)