Создание программы 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.