/ / Fazendo um programa collatz automatizar o material chato - python, python-3.4

Fazendo um programa de collatz automatizar as coisas chatas - python, python-3.4

Estou tentando escrever um programa collatz usando as diretrizes de um projeto encontrado no final do capítulo 3 de Automatizar o material chato com o Python. Estou usando o python 3.4.0. Aqui está o esboço do projeto:

Escreva uma função chamada collatz () que possui umaparâmetro chamado number. Se o número for par, então collatz () deve imprimir o número // 2 e retornar esse valor. Se o número for ímpar, então collatz () deve imprimir e retornar 3 * número + 1. Em seguida, escreva um programa que permita ao usuário digitar um número inteiro e que continue chamando collatz () nesse número até que a função retorne o valor 1.

A saída deste programa pode ser algo como isto: Digite o número: 3 10 5 16 8 4 2 1

Estou tentando criar uma função que use if einstruções elif dentro de um loop while. Quero que o número seja impresso e, em seguida, retorne ao início do loop e reduza-se a um usando a sequência collatz, com cada instância de um número resultante sendo impressa à medida que ele percorre o loop. Com o meu código atual, só consigo imprimir a primeira instância do número, e esse número não passa pelo loop depois disso. Aqui está o meu código:

#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)

Respostas:

10 para resposta № 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))

Saída:

Dê-me um número: 3 10 5 16 8 4 2 1

Dê-me um número: 11 34 17 52 26 13 40. 20 10 5 16 8 4 2 1


3 para resposta № 2

Aqui está o que eu criei:

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!

2 para resposta № 3

Seu collatz() A função deve imprimir e retornar apenas o próximo valor. (Termina quando retorna.)

o while loop não deve estar dentro do collatz() função.

Você também recebeu nomes de variáveis ​​inconsistentes (n, number, nnumber) e algum código importante é comentado.


0 para a resposta № 4

Nuncjo conseguiu a solução que funciona. Eu ajustei um pouco para adicionar try e exceto instruções para tratamento de erros.

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 != 1:
n = collatz(int(n))
except ValueError:
print("whoops, type an integer, bro.")

0 para a resposta № 5
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.")

Isto é o que eu vim por conta própria e com baseapenas sobre o que aprendi com o livro até agora. Demorei um pouco, mas uma das ferramentas que usei foi inestimável para encontrar minha solução e também foi inestimável para aprender esse conteúdo: a ferramenta visualizador de python em: http://www.pythontutor.com/visualize.html#mode=edit

Pude ver o que meu código estava fazendo e onde ele estava sendo desligado e pude fazer ajustes continuamente até acertar.


0 para a resposta № 6
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)

0 para resposta № 7

Meu código

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")

0 para a resposta № 8
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")

Isto é o que eu criei para esta práticaexercício. Ele pede uma entrada Valida se é um número inteiro. Caso contrário, ele repreende e sai. Se for, ele percorre a sequência de collatz até que o resultado seja 1 e você ganha.


0 para a resposta № 9
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")

Eu adicionei validação de entrada


0 para a resposta № 10

Falta uma coisa a cada solução neste encadeamento: se o usuário digitar "1", a função ainda deverá executar os cálculos da sequência Collatz. Minha solução:

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")

0 para resposta № 11
def collatz (número): if (número% 2 == 0): n = número // 2 impressão (n) retorno n outro: ev = 3 * número + 1 print (ev) retornar ev num1 = entrada ("Digite um número: n")  experimentar: num = int (num1) if (num == 1): print ("Digite um número inteiro maior que 1") elif (num> 1): a = collatz (num) while (True): se (a == 1): quebrar outro: a = collatz (a) outro: print ("Digite um número inteiro positivo para iniciar a sequência Collatz")  exceto: print ("digite um número inteiro")

Tente encontrar uma solução baseada no capítulo Função, de automatizar o material chato. Se precisar de ajuda relacionada ao Problema Collatz, visite aqui: http://mathworld.wolfram.com/CollatzProblem.html


0 para a resposta № 12

estou lendo o mesmo curso e fiz muitosolução longa (melhorando quando eu aprender algo novo). sugiro manter o seu programa de colagens atualizado à medida que avança nos capítulos, é um bom treinamento. o meu agora tem manipulação de strings e salva em collatzrecords.txt agora!

Resolvi o problema principal usando a recursão (um método chama a si mesmo):

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 é minha lista de todos os valores que um número "vê" no caminho para 1. como você pode ver, quando o número é par, o ethod é chamado novamente com o número / 2. se o número for par, é chamado com o número * 3 + 1.

modificado o número == 1 cheque um pouco. espero que economize tempo de cálculo - já estou chegando a 23.000.000! (o registro atual é 15 733 191 com 704 etapas para chegar a 1)


0 para a resposta № 13
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")

0 para a resposta № 14
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")

O loop extra while True ajudará o programa a continuar funcionando depois que o usuário inserir um não inteiro.


0 para a resposta № 15
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.")

0 para a resposta № 16
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:")

0 para a resposta № 17

Aqui estão minhas 19 linhas:

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.")

0 para a resposta № 18

Penso que esta solução pode ser ainda mais simples para os alunos do que a aceite:

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

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

O resultado será algo como isto:

Enter a number: 5
16
8
4
2
1

0 para a resposta № 19

Minhas 17 linhas de código para o mesmo exercício que criei.

    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.")

-1 para resposta № 20

Algo que me ajudou muito nesse estágio do meu aprendizado é entender que uma função deve ter um propósito bem definido, e adicionar um loop à função dilui isso.

Aqui está minha solução (alguém me ajudou a trabalhar nisso e resolveu os mesmos erros que vejo no seu código):

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.