Перепишите код, чтобы он занимал меньше строк (сейчас - 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 шт):
Ваша задача упростить мою программу, но сохранить функционал
а ваша задача научиться правильно формулировать вопрос :) или с таким вопросом идти на удаление темы как учебного задания
вариант 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 строчки :)
У меня без 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 строк!