Вот программа, которая предназначена для рекурсивного подсчета длины последовательности Коллатца:
def odd_collatz ( n ):
return (3 * n) + 1
def even_collatz ( n ):
return int(n / 2)
def collatz_counter ( initialNumber, initialLength ):
length = initialLength
while True:
if initialNumber == 1:
return length
elif initialNumber != 1:
length += 1
if initialNumber % 2 == 0:
collatz_counter(even_collatz(initialNumber), length)
else:
collatz_counter(odd_collatz(initialNumber), length)
print(collatz_counter(13, 1)
Ожидаемый ответ - 10. Однако программа застревает в бесконечном цикле. На предпоследнем шаге последовательности initalNumber
равно 2. Программа работает должным образом: collatz_counter
вызывается с использованием even_collatz
и числа 10.
Ожидаемым действием следующего шага будет запуск collatz_counter
с initialNumber
, равным 1, и initialLength
, равным 10. Я ожидал, что произойдет то, что первый оператор if будет иметь значение true, collatz_counter
должен вернуть length
, а затем выйти. Однако это не то, что происходит:
На самом деле происходит то, что функция оценивает первый оператор if, запускает строку return length
, а затем переходит к строке кода под if initialNumber % 2...
, и весь процесс повторяется снова и снова в бесконечном цикле.
Есть идеи относительно того, почему это может происходить?
collatz_counter
- person Andrew   schedule 20.08.2016collatz_counter()
отсутствует закрывающая скобка. Кроме того, как предполагает @Andrew, эти строки должны бытьreturn
collatz_counter(...)
- person Warren Weckesser   schedule 20.08.2016print(collatz_counter(13, 1))
, вы пропустили одну закрывающую скобку. - person linusg   schedule 20.08.2016