Создание программы collatz автоматизирует скучный материал

Я пытаюсь написать программу Collatz, используя рекомендации из проекта, приведенного в конце главы 3 "Автоматизация скучных вещей с помощью Python". Я использую Python 3.4.0. Ниже приводится схема проекта:

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

Вывод этой программы может выглядеть примерно так:

Enter number: 3 10 5 16 8 4 2 1 

Я пытаюсь сделать функцию, которая использует операторы if и elif в цикле while. Я хочу, чтобы число печаталось, а затем возвращалось к началу цикла и уменьшало себя до единицы, используя последовательность Коллатца, причем каждый экземпляр результирующего числа печатался по мере прохождения цикла. С моим текущим кодом я могу печатать только первый экземпляр числа, и этот номер не проходит цикл после этого. Ниже приведен мой код:

#collatz

print("enter a number:")
try:
    number = (int(input()))
except ValueError:
          print("Please enter a valid INTEGER.")


def collatz(number):
    while number != 1:

        if number % 2==0:
            number = (number//2)
            #print(number)
            return (print(int(number)))

        elif nnumber % 2==1:
            number = (3*number+1) 
            #print(number)
            return (print(int(number)))

        continue


collatz(number)

Ответ 1

def collatz(number):

    if number % 2 == 0:
        print(number // 2)
        return number // 2

    elif number % 2 == 1:
        result = 3 * number + 1
        print(result)
        return result

n = input("Give me a number: ")
while n != 1:
    n = collatz(int(n))

Выход:

Give me a number: 3
10
5
16
8
4
2
1

Give me a number: 11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Ответ 2

Вот что я придумал:

import sys

def collatz(number):
    if number % 2 == 0:           # Even number
        result = number // 2
    elif number % 2 == 1:         # Odd number
        result = 3 * number + 1

    while result == 1:            # It would not print the number 1 without this loop
        print(result)
        sys.exit()                # So 1 is not printed forever.

    while result != 1:            # Goes through this loop until the condition in the previous one is True.
        print(result)
        number = result           # This makes it so collatz() is called with the number it has previously evaluated down to.
        return collatz(number)    

print('Enter a number: ')         # Program starts here!
try:
    number = int(input())         # ERROR! if a text string or float is input.
    collatz(number)
except ValueError:
    print('You must enter an integer type.')

                                  # Fully working!

Ответ 3

Ваша функция collatz() должна печатать и возвращать только следующее значение. (Он заканчивается, когда он возвращается.)

Цикл while не должен находиться внутри функции collatz().

У вас также есть несогласованные имена переменных (n, number, nnumber), а некоторые важные коды закомментированы.

Ответ 4

Мои 17 строк кода для того же упражнения, которое я придумал.

    def collatz(number):
    """ check if the number is even or odd and performs calculations.
    """
    if number % 2  == 0: # even
        print(number // 2)
        return number //2
    elif number % 2 != 0: # odd 
        result = 3*number+1
        print(result)
        return result

try:
    n = input('Enter number: ') # takes user input
    while n !=1: # performs while loop until 'n' becomes 1
        n = collatz(int(n)) # passes 'n' to collatz() function until it arrives at '1'
except ValueError:
    print('Value Error. Please enter integer.')

Ответ 5

Нунджо получил решение, которое работает. Я немного подправил, чтобы добавить try и кроме операторов для обработки ошибок.

def collatz(number):
    if number % 2 == 0:
        print(number // 2)
        return number // 2

    elif number % 2 == 1:
        result = 3 * number + 1
        print(result)
        return result

try:
    n = input("Enter number: ")
    while n > 0 and n!= 1:
        n = collatz(int(n))
except ValueError:
    print('whoops, type an integer, bro.')

Ответ 6

def collatz(number):
    while number != 1:
        if number % 2 == 0:
            number = number // 2
            print(number)

        elif number % 2 == 1:
            number = number * 3 + 1
            print(number)

try:
    num = int(input())
    collatz(num)
except ValueError:
    print('Please use whole numbers only.')

Это то, что я придумал сам и основанный исключительно на том, что я узнал из книги до сих пор. Мне потребовалось немного, но один из инструментов, которые я использовал, был бесценным для меня, чтобы найти мое решение, а также было неоценимым в изучении этого контента, это инструмент визуализации питона: http://www.pythontutor.com/visualize.html#mode=edit

Я смог посмотреть, что делает мой код, и где он повесил трубку, и я смог постоянно делать твики, пока не понял.

Ответ 7

def collatz(num): 
    if num % 2: 
        return 3 * num + 1
    else:
        return num // 2

while True:
    try:
    number = int(input('Enter a positive integer.'))  
    if number <= 0: 
        continue
    break
except ValueError: 
    continue


while number != 1:
    number = collatz(number)
    print(number)

Ответ 8

Мой код

def collatz(number):
    while number != 1:
        if number % 2 == 0:
            print(number // 2)
            number = number // 2
        elif number % 2 == 1:
            print(number * 3 + 1)
            number =  number *3 + 1

try:
    print ('Enter the number to Collatz:')
    collatz(int(input()))
except ValueError:
    print('Enter a valid integer')

Ответ 9

def collatz(number):
    if number % 2 == 0:  # Even number
        return number // 2

    elif number % 2 == 1:  # Odd number
        return number * 3 + 1

print('Please enter a number') # Ask for the number


# Check if the number is an integer, if so, see if even or odd. If not, rebuke and exit
try:
    number = int(input())
    while number != 1:
        collatz(number)
        print(number)
        number = collatz(number)
    else:
        print('You Win. The number is now 1!')
except ValueError:
     print('Please enter an integer')

Вот что я придумал для этой практики. Он запрашивает ввод Проверяет, является ли это целым числом. Если нет, он упрекает и уходит. Если это так, он проходит через последовательность collatz, пока результат не будет равен 1, а затем вы выиграете.

Ответ 10

def collatz(number):
    if number % 2 == 0:
        print(number//2)
        return number // 2
    elif number % 2 == 1:
        print(3*+number+1)
        return 3 * number + 1
r=''
print('Enter the number')
while r != int:
    try:
        r=input()
        while r != 1:
            r=collatz(int(r))
        break   
    except ValueError:
            print ('Please enter an integer')

Я добавил подтверждение ввода

Ответ 11

В каждом решении этого потока отсутствует одно: если пользователь вводит "1", функция все равно должна выполнять вычисления последовательности Collatz. Мое решение:

def collatz(number):
    while number == 1:
        print("3 * " + str(number) + " + 1 = " + str(3*number+1))
        number = 3*number+1 ##this while loop only runs once if at all b/c at end of it the value of the variable is not equal to 1
    else:
        while number != 1:
            if number % 2 == 0:
                print(str(number) + ' // 2 = ' + str(number//2))
                number = number//2
            else:
                print("3 * " + str(number) + " + 1 = " + str(3*number+1))
                number = 3*number+1

 print('Please input any integer to begin the Collatz sequence.')

while True:
    try:
        number = int(input())
        collatz(number)
        break
    except ValueError:
        print('please enter an integer')

Ответ 12

def collatz(number):
    if(number%2==0):
        n=number//2
        print(n)
        return n
    else:
        ev=3*number+1
        print(ev)
        return ev
num1=input("Enter a number: \n")

try:
    num= int(num1)
    if(num==1):
        print("Enter an integer greater than 1")
    elif(num>1):
        a=collatz(num) 
        while(True):
            if(a==1):
                break
            else:
                a=collatz(a)
    else:
        print("Please, Enter a positive integer to begin the Collatz sequence")

except:
    print("please, Enter an integer")

Попробуйте придумать решение, основанное на главе Function, для автоматизации работы скучного материала. Если вам нужна помощь, связанная с проблемой Collatz, посетите страницу: http://mathworld.wolfram.com/CollatzProblem.html

Ответ 13

Я читаю один и тот же курс, и я сделал очень длинное решение (улучшая его, когда я узнаю что-то новое). Я предлагаю обновить вашу программу collatz по мере продвижения в главах, ее хорошую подготовку. у меня есть манипуляция строками и сохранение в \collatzrecords.txt сейчас!

Я решил основную проблему, используя рекурсию (метод вызывает себя):

def autocollatz(number):
global spam                     
spam.append(number)             
if number % 2 == 0:             
    autocollatz (int(number/2))
elif number % 2 == 1 and number != 1:
    autocollatz(int(number*3+1))

spam - это мой список для всех значений, число которых "видит" на пути 1. как вы можете видеть, когда число равно даже, этод называется agin с номером /2. если число равно, оно вызывается с номером * 3 + 1.

изменил число == 1 немного. Надеюсь, это экономит расчетное время - им до 23 000 000 уже! (текущая запись составляет 15 733 191 с 704 шагами, чтобы получить ее до 1)

Ответ 14

import sys

def collatz(number):
if number % 2 == 0:
    result = number // 2
    print (result)

elif number % 2 == 1:
    result = number * 3 + 1
    print (result)

while result == 1:
    sys.exit

while result != 1:
    number = result
    collatz(number)

print ('Enter a number')

try:
    number = int(input())
    collatz(number)

except ValueError:
    print('Please enter a valid integer')

Ответ 15

def collatz(number):
    while number != 1:
        if number %2==0:
            number = number//2
            yield number
        elif number %2 ==1:
            number=number*3 +1
            yield number

while True:
    try:
        for n in collatz(int(input('Enter number:'))):
            print(n)
        break
    except ValueError:
        print('Please enter an integer')

Дополнительный while True цикл поможет программе продолжить работу после того, как пользователь вводит нецелое число.

Ответ 16

def collatz(number):
    if number % 2 == 0:
        return number // 2
    elif number % 2 == 1:
        return 3 * number + 1

try:
    chosenInt = int(input('Enter an integer greater than 1: '))

    while chosenInt < 2:
        print("Sorry, your number must be greater than 1.")
        chosenInt = int(input('Enter an integer greater than 1: '))

    print(chosenInt)

    while chosenInt != 1:
        chosenInt = collatz(chosenInt)
        print(chosenInt)

except ValueError:
    print('Sorry, you must enter an integer.')

Ответ 17

def collatz(number): 
    if number%2==0:    
        return number//2
    elif number%2==1:
        return number*3+1
step=1 #counter variable for amusement and seeing how many steps for completion.
try: #in case of ValueError   
    number=int(input('Enter a Number for Collatz Sequencing:')) 
    while collatz(number)!=1:    
        print(collatz(number))
        number=int(collatz(number))
        if collatz(number)!=1: 
            print('Calculating step ' + str(step) + '.')
            step=step+1
        else:
            print ('Calculating step ' +str(step) + '.')
            print('1 Has Been Reached.')
except ValueError: 
     print('Enter an Integer please:')

Ответ 18

Здесь мои 19 строк:

def collatz(number):
    if number % 2 == 0:
        return number // 2
    else:
        return number*3 + 1


number = 0
while number == 0:
    try:
        number = int(input('Please enter a number: '))
        if number == 0:
            print('Number must be an integer not equal to zero.')
        else:
            while True:
                number = collatz(number)
                print(number)
                if abs(number) == 1 or number == -5 or number == -17: 
                    break #Collatz seq ends/enters recurring loop when number hits -17, -5, -1 or 1
    except ValueError:
        print('Number must be an integer.')

Ответ 19

Я думаю, что это решение может быть еще проще для учащихся, чем принятое:

def collatzSequence(number):
    if (number % 2 == 0): # if it even
        number = number // 2
    else:                 # if it odd
        number = number * 3 + 1
    print (number)
    return (number)

n = int(input('Enter a number: '))
while (n != 1):
    n = collatzSequence(n)

Результат будет примерно таким:

Enter a number: 5
16
8
4
2
1

Ответ 20

def collatz(number):
    if number % 2 == 0: # Even
        print(number // 2)
        return number // 2
    print(3 * number + 1) # If it not even, it odd
    return 3 * number + 1

try:
    while True:
        n = int(input("Enter a positive number: ")) # Ask for a +ve number
        if n > 0:
            while n != 1: # Performs while loop until n becomes 1
                n = collatz(n) # Passes n to collatz() until it becomes 1
            break
        else:
            print("Please enter a positive number.")
            continue
except ValueError:
    print("ValueError: Please enter a positive number.")

Ответ 21

Мне удалось сделать это правильно, не используя никаких операторов возврата, и вложил цикл while внутри функции.

number=int(input('Enter number:\n'))

def collatz(number):

    while number !=1:
        if number% 2 == 0:
            number= number//2
            print(number)

        else:
           number=  3 * number + 1
           print(number)    


collatz(number)

Ответ 22

Я добавил попробовать и кроме как это (с перерывом)

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

n = input("Give me a number: ")

while n != 1:
    try:
        isinstance(n, int)
        n = collatz(int(n))
    except:
        print('Error: Invalid argument.')
        break

Ответ 23

14 строк:

Не понимаю, почему нам нужно "elif number% 2 == 1:" вместо простого "else"?

def  collatz(number):
    while number != 1:
        if number %2 == 0:
            number = number/2
            print(number)
        else:
            number = 3*number+1
            print(number)
print('Enter a number')
try:
    number = (int(input()))
except ValueError:
          print("Please enter an INTEGER.")
collatz(number)

Ответ 24

Что-то, что очень помогло мне на этом этапе моего обучения, заключается в понимании того, что функция должна иметь четко определенную цель, а добавление цикла в функцию размывает это.

Вот мое решение (кто-то помог мне работать над этим и обратился к тем же ошибкам, что и в вашем коде):

def collatz(number): # defining the function here. The function takes 1 argument - number.

    if number % 2 == 0: # if statement where we say that if the remainder of number by 2 is 0, then its an even number.
        even = number // 2 # assign number divided by two to a variable named even.
        print(even) # displaying that even value.
        return even # return that value.
    else: # else if number is not even.
        odd = 3 * number + 1 # then it is an odd number, and if it is an odd number then we will multiple that number by 3 and add 1.
        print(odd) # printing the odd number
        return odd # return that value

try:
    number = int(input('please enter a number:')) # number is an input from a user and here we ask the user for what input
except ValueError:
    print('Error, you must enter an integer.')


while number !=1: # while loop states that while the value of number does not equal 1...
       number = collatz(number) # ... assign the output of the collatz() function as a new value of the number, and run the collatz() function again.