Перепишите код, чтобы он занимал меньше строк (сейчас - 20 строк)

Ваша задача упростить мою программу, но сохранить функционал

Согласно гипотезе Коллатца, любое число можно перевести в такую последовательность цифр, которая всегда заканчивается единицей. Эту последовательность называют простейшей из неразрешённых проблем математики, потому что это гипотеза так и не была доказана. Последовательность словами описывается очень просто: есть функция, в которую мы передаём любое число. Если число чётное, тогда делим его на 2 ( т.е. число / 2 ). Если нечётное - тогда мы это число умножаем на 3 + 1 ( т.е. число * 3 + 1 ). Значение, которое нам вернула функция мы опять подставляем в эту функцию ( такая своеобразная рекурсия )

    def collatz( number ) :
      if number % 2 == 0 : # чётное
        result = number // 2
      if number % 2 == 1 : # нечётное
        result = 3 * number + 1
      print( result )
      return result
    
    error = True
    while error :
      error = True
      try :
        num = int( input( 'Введите число больше нуля: ' ) )
        if num > 0 :
          error = False
      except :
        error = True
    
    firstTime = True
    while num != 1 or firstTime :
      firstTime = False
      num = collatz( num )
    
    # если number - чётное, тогда это число надо разделить на 2 без остатка

Ответы (2 шт):

Автор решения: Zhihar

Ваша задача упростить мою программу, но сохранить функционал

а ваша задача научиться правильно формулировать вопрос :) или с таким вопросом идти на удаление темы как учебного задания

вариант 1:

def collatz(number):
    result = (number // 2) if number % 2 == 0 else (3 * number + 1)
    print(result)
    if result != 1:
        collatz(result)


num = 0

while num <= 0:
    try:
        num = int(input('Введите число больше нуля: '))
    except:
        num = 0

collatz(num)

функцию можно переделать в таком виде, чтобы сразу обрабатывать число 1 и выводить всю комбинацию, начиная с первого числа

def collatz(number):
    print(number)
    if number != 1:
        result = (number // 2) if number % 2 == 0 else (3 * number + 1)
        collatz(result)

вот вариант без print внутри функции, т.е. формирование списка и вывод списка:

def collatz(number):
    res = [number]
    if number != 1:
        result = (number // 2) if number % 2 == 0 else (3 * number + 1)
        res += collatz(result)
    return res

num = 0

while num <= 0:
    try:
        num = int(input('Введите число больше нуля: '))
    except:
        num = 0

print(*collatz(num), sep='\n')

Ну и решение в 1 строчку:

def collatz(number):
    return [number] + ([] if number == 1 else (collatz((number // 2) if number % 2 == 0 else (3 * number + 1))))

num = 0

while num <= 0:
    try:
        num = int(input('Введите число больше нуля: '))
    except:
        num = 0

print(*collatz(num), sep='\n')

Еще более короткий вариант функции:

def collatz(value):
    return [value] + ([] if value == 1 else (collatz((3 * value + 1) if value % 2 else (value // 2))))

Итак, если не требуется проверки на неверный ввод данных, то код можно свернуть в следующий вид:

def collatz(i):
    return [i] + ([] if i <= 1 else (collatz((3 * i + 1) if i % 2 else (i // 2))))

print(*collatz(int(input('Введите число больше нуля: '))), sep='\n')

итого код - 3 строчки :)

→ Ссылка
Автор решения: ПИТОНИСТ версия-3-8

У меня без def, с while:

while True:
    n=int(input("Введите любое число больше нуля  --> "))
    if n > 0:
        break
while True:
    if n == 1:
        print("Конец! Получилось число 1!")
        break
    if n%2==0:
        n=int(n/2)
        print(n)
    else:
        n=n*3+1
        print(n)

Итого - 14 строк!

→ Ссылка