Примерно так:
def get_collatz(n):
return [n // 2, n * 3 + 1][n % 2]
while True:
user_input = input("Enter a positive integer: ")
try:
n = int(user_input)
assert n > 1
except (ValueError, AssertionError):
continue
else:
break
sequence = [n]
while True:
last_item = sequence[-1]
if last_item == 1:
break
sequence.append(get_collatz(last_item))
print(*sequence, sep="\t")
Вывод:
Enter a positive integer: 12
12 6 3 10 5 16 8 4 2 1
>>>
РЕДАКТИРОВАТЬ Попытка сохранить его похожим на ваш код:
Я бы изменил вашу sequence
функцию на что-то вроде этого:
def get_collatz(n):
if n % 2 == 0:
return n // 2
return n * 3 + 1
Я назвал это get_collatz
, потому что я думаю, что это более наглядно, чем sequence
, хотя это все еще не очень хорошее имя - если вы хотел быть очень явным, может быть get_collatz_at_n
или что-то в этом роде.
Обратите внимание, я полностью удалил ветку else, поскольку она не требуется. Если n % 2 == 0
, то мы возвращаемся из функции, поэтому либо вы возвращаетесь в теле if
, либо возвращаете одну строку ниже - не нужно else
.
В остальном, может быть:
last_number = int(input("Enter a positive integer: "))
while last_number != 1:
print(last_number, end="\t")
last_number = get_collatz(last_number)
В Python, print
имеет необязательный параметр ключевого слова с именем end
, который по умолчанию равен \n
. Это означает, какой символ должен быть напечатан в самом конце оператора print. Просто изменив его на \t
, вы можете распечатать все элементы последовательности в одной строке, разделенные табуляцией (поскольку каждое число в последовательности вызывает отдельную инструкцию print).
Однако при таком подходе Вам нужно будет обязательно распечатать конечный 1
после окончания while
l oop, поскольку l oop завершится, как только last_number
станет 1
, что означает, что l oop не сможет распечатать его.
Другой способ печати последовательности (с разделительными вкладками) - сохранить последовательность в списке, а затем использовать str.join
для создания строка из списка, где каждый элемент отделен некоторой строкой или символом. Конечно, для этого необходимо, чтобы все элементы в списке были строками - в этом случае я использую map
для преобразования целых чисел в строки:
result = "\t".join(map(str, [12, 6, 3, 10, 5, 16, 8, 4, 2, 1]))
print(result)
Вывод:
12 6 3 10 5 16 8 4 2 1
>>>