Как изменить код, чтобы он возвращал количество итераций, выполненных циклом 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)
→ Ссылка