Как изменить код, чтобы он возвращал количество итераций, выполненных циклом for?
# Modify the code below to return the number of iterations the for-loop performed
def collatz(n):
initial = n
print(initial)
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
print( n )
# if we got here, n must be 1
print( "halted on input", initial )
print(collatz(17))
Ответы (4 шт):
Автор решения: MarianD
→ Ссылка
Изменить на for не удастся, но количество итераций не проблема - вместо вашей части
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
print( n )
примените
num_of_iter = 0
while n != 1:
num_of_iter += 1
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
print( n )
и после окончания цикла будет в переменной num_of_iter количество итераций.
Автор решения: Spartak
→ Ссылка
def collatz(n):
initial = n
print(initial) #напечатать исходное число, переданное в функцию
count = 0 #добавьте счетчик итераций
while n != 1:
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
count +=1 #увеличивайте его значение на 1 каждую итерацию
#print(count) #напечатайте на экран количество итераций
return(count) #в задании у вас именно return указан
a = collatz(17) #print тут не к чему
print(a)
Автор решения: MarianD
→ Ссылка
Когда вам действительно нужен цикл for, не глядя на то, что он здесь неподходящий, вы можете применить бесконечную последовательность чисел из генератора чисел, например генератор count() из модуля itertools:
import itertools
def collatz(n):
initial = n
print(initial)
for num_iter in itertools.count(1):
if n == 1:
break
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
print(n)
print(f"Number of iterations: {num_iter}")
print( "halted on input", initial )
print(collatz(17))
Автор решения: CrazyElf
→ Ссылка
Ещё один вариант с for и без использования библиотеки itertools, чистый Python:
for i,_ in enumerate(iter(int, 1), 1):
if n % 2 == 0:
n = n // 2
else:
n = 3 * n + 1
print(n)
if n == 1:
break
print(i)