Как зациклить функцию и вернуть нужные значения?
Есть функция, нужно чтоб при определенном введеном аргументе просчитывалось значение и функции, затем просчитать значение функции с предыдущим аргументом и так до тех пор пока оно не станет равно 1 и после этого все значения добавить в массив.
def f(n):
if n % 2 == 0:
return n / 2
else:
return 3 * n + 1
Например при значении 13 будет последовательность: 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
Ответы (3 шт):
Автор решения: WIND _NICT
→ Ссылка
def f(n):
while n>1 :
if n % 2 == 0:
n=n/2
else:
n=3 * n + 1
print(n)
f(13)
Автор решения: ProgerOffline
→ Ссылка
Вам нужно вызывать функцию пока число не станет меньше, либо равным единице. Это можно легко реализовать через рекурсию.
def f(n, numbers_list=[]):
# Проверяем меньше либо равно число единице
# Если да, то возвращаем список, в который мы добавили числа
if n <= 1:
return numbers_list
# Если число четное, то добавляем его в список - делим на два, и вызываем фун-цию
elif n % 2 == 0:
numbers_list.append(n)
f(n / 2)
# Если число не четное, добавляем его в список, и вызываем фун-цию
else:
numbers_list.append(n)
f(3 * n + 1)
# Возвращаем весь, список
return numbers_list
Автор решения: SergFSM
→ Ссылка
зациклить функцию и потом вернуть массив можно так:
def f(n):
if n % 2 == 0:
return n // 2
else:
return 3 * n + 1
number = 13
res = [number]
while number!=1:
number = f(number)
res.append(number)
print(res) # [13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
или, как уже было сказано, использовать вместо цикла рекурсию:
def f(n):
return [n] if n==1 else [n] + f(n//2 if n%2==0 else 3*n+1)
f(13) # [13, 40, 20, 10, 5, 16, 8, 4, 2, 1]