2016-09-29 4 views
0

Я пытаюсь написать программу collatz из «Автоматизировать скучные вещи с помощью книги Python», но столкнулся с некоторыми проблемами. Я использую python 3.5.2. Вот схема проекта:Использование while циклов и переменных

Напишите функцию с именем collatz(), которая имеет один параметр с именем number. Если число четное, тогда collatz() должен напечатать номер // 2 и вернуть это значение. Если число нечетное, тогда collatz() должен печатать и возвращать 3 * число + 1. Затем напишите программу, которая позволяет пользователю вводить целое число и которая вызывает вызов collatz() на этом номере, пока функция не вернет значение 1.

Мой код:

def collatz(number): 
    if number % 2 == 0:  #its even 
     print(number // 2) 
     return number // 2 
    elif number % 2 == 1: #its odd 
     print(3*number+1) 
     return 3*number+1 


print('Type an integer: ') 
num=int(input()) 

while(True): 
    if collatz(num) == 1: 
     break 

# Or even simpler: 
# while(collatz(num) != 1): 
#  pass 

выход дает мне бесконечный цикл:

Type an integer: 
10 
5 
5 
5 
5 
5 
5 
5 
5 
... 

Но когда я разбить его и использовать переменную для хранения возвращаемого значения, он работает:

while(True): 
    num=collatz(num) 
    if num == 1: 
     break 

Выход:

Type an integer: 
5 
16 
8 
4 
2 
1 

Почему это? Я не понимаю, почему первая программа не работает. Оба они похожи, но я просто решил проверить возвращаемое значение непосредственно в моей исходной программе вместо использования переменных. Буду признателен за любую помощь, спасибо.

+6

Ваша бесконечная версия цикла никогда не обновляет значение 'num'. – Blorgbeard

+1

Ну, это была очень глупая ошибка с моей стороны. Ну, это случается .. Спасибо человеку. – tadm123

ответ

2

Ваш код:

while(True): 
    if collatz(num) == 1: 
     break 

не работает, потому что каждый раз, когда collatz вызывается он вызывается с тем же значением NUM и как результат снова и снова возвращает тот же номер. Это число не равно 1, поэтому у вас есть бесконечный цикл.

Когда вы делаете num = collatz(num), значение num изменяется при первом вызове функции. Затем новое значение передается во второй раз, когда вызывается функция, и так далее. Поэтому в итоге вы достигнете точки, когда значение num станет равным 1 и выйдет из цикла.

+0

Пожалуйста, учитывайте, что не отвечаете на вопросы, которые сводятся к проблемам с типографией и [можно ответить в комментарии] (http://stackoverflow.com/questions/39780993/using-while-loops-and-variables#comment66856127_39780993). Эти вопросы не полезны для будущих читателей, но предоставление полных ответов может препятствовать прецессии автоматического удаления, а также загромождать переполнение стека в долгосрочной перспективе. –

+0

@AndrasDeak Я не знаю, как мы определяем здесь вопросы о типовом классе. Можете ли вы указать мне некоторые рекомендации? Из того, что я вижу, у ОП есть проблема, понимающая логику его кода. Для опытных программистов это тривиально, но для новичков это может быть не то же самое. Ошибка, которую он сделал, не опечатка, а ошибка в коде. – xuanluong

+1

Вы правы, я склонен считать опечатки той же категорией, что и очень простые ошибки, которые имеют сто дубликатов :) Вот текст по причине, близкой к опечаткам: «* Этот вопрос был вызван проблемой, которая может больше не воспроизводятся или просто опечатка. Хотя подобные вопросы могут быть по-теме здесь, этот вопрос был разрешен в манере, которая вряд ли поможет будущим читателям. [...] * ". Я имел в виду мой комментарий в духе второго предложения. Я верю, что ваш ответ хорош, и вы можете сохранить его.Просто хотел рассмотреть этот аспект в будущем :) –

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