2016-04-27 2 views
1

Я сделал код, который измеряет количество шагов, необходимых для возврата к 1 в Collatz Гипотеза. Вот мой кодСброс счетчика Collatz на каждой новой рекурсии

counter = 0 
def collatz(n): 
    global counter 
    counter += 1 
    if n <= 0 : 
     return "Invalid Number" 
    elif n == 1 : 
     return counter 
    elif n % 2 == 1 : 
     n = 3*n + 1 
     return collatz(n) 
    elif n % 2 == 0 : 
     n = n/2 
     return collatz(n) 
print(collatz(9921615699)) 
print(collatz(9921615699)) 

Я ожидаю, что последняя две команды печати для печати 311 и 311. Вместо этого они печатают 311 и 622. Я думаю, что было достаточно легко увидеть в коде, что является неправильным. Как я могу это исправить? как можно сбрасывать счетчик каждый раз, когда команда завершается, а не когда функция запускается.

ответ

4

Вместо того, чтобы использовать глобальную переменную, которую вы могли бы сделать счетчик параметр со значением по умолчанию:

def collatz(n, counter=0): 
    counter += 1 
    if n <= 0 : 
     return "Invalid Number" 
    elif n == 1 : 
     return counter 
    elif n % 2 == 1 : 
     n = 3*n + 1 
     return collatz(n, counter) 
    elif n % 2 == 0 : 
     n = n/2 
     return collatz(n, counter) 
+0

Это подействовало. Благодаря! Собираюсь отмечать как An ASAP –

1

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

def collatz(n, counter=0): 
    counter += 1 
    if n <= 0 : 
     return "Invalid Number" 
    elif n == 1 : 
     return counter 
    elif n % 2 == 1 : 
     n = 3*n + 1 
     return collatz(n, counter) 
    elif n % 2 == 0 : 
     n = n/2 
     return collatz(n, counter) 
print(collatz(9921615699)) 
print(collatz(9921615699)) 

Вы использовали global в своей оригинальной версии, которая обычно не то, что вы хотите сделать. Вы должны увидеть из первых рук, почему.

Вы, , могли сбросить счетчик, например.

result = counter 
counter = 0 
return result 

Но это довольно неприятно, давайте не будем этого делать. Когда вы реализуете рекурсивный алгоритм, вероятно, нет веской причины иметь глобальную переменную.

Смежные вопросы