J'essaie d'écrire un programme collatz en utilisant les directives d'un projet trouvé à la fin du chapitre 3 de Automatiser les choses ennuyeuses avec Python. J'utilise python 3.4.0. Voici le résumé du projet:
Ecrivez une fonction nommée collatz () qui a un paramètre nommé nombre. Si number est pair, alors collatz () devrait afficher number // 2 et renvoyer cette valeur. Si nombre est impair, alors collatz () devrait imprimer et renvoyer 3 * nombre + 1. Ensuite, écrivez un programme qui permet à l'utilisateur de taper un entier et continue d'appeler collatz () sur ce nombre jusqu'à ce que la fonction renvoie la valeur 1.
La sortie de ce programme pourrait ressembler à ceci: Entrez le numéro: 3 10 5 16 8 4 2 1
J'essaie de créer une fonction qui utilise les instructions if et Elif au sein d'une boucle while. Je veux que le nombre soit imprimé, puis retourne au début de la boucle et se réduit à un seul en utilisant la séquence collatz, chaque instance du nombre résultant étant imprimée au fur et à mesure de son passage dans la boucle. Avec mon code actuel, je ne peux imprimer que la première instance du numéro, et ce numéro ne passe pas dans la boucle par la suite. Voici mon code:
#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)
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))
Sortie:
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
Voici ce que je suis venu avec:
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!
Votre fonction collatz()
devrait imprimer et renvoyer uniquement la valeur suivante. (Il se termine quand il revient.)
La boucle while
ne doit pas être à l'intérieur de la fonction collatz()
.
Vous avez également des noms de variable incohérents (n
, number
, nnumber
) et certains codes importants sont commentés.
Mes 17 lignes de code pour le même exercice que celui que j'ai élaboré.
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.')
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:')
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')
La boucle additionnelle while True aidera le programme à continuer de fonctionner après que l'utilisateur ait entré un nombre non entier.
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.')
Voici mes 19 lignes:
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.')
Il manque un élément à chaque solution de ce thread: si l'utilisateur entre "1", la fonction doit toujours exécuter les calculs de la séquence de Collatz. Ma solution:
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')
Nuncjo a la solution qui fonctionne. Je l'ai légèrement modifié pour ajouter try et except instructions pour la gestion des erreurs.
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.')
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)
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')
def collatz (nombre): si (nombre% 2 == 0): n = nombre // 2 print (n) retourne n autre: ev = 3 * nombre + 1 print (ev) return ev num1 = input ("Entrez un nombre:\n") essayez: num = int (num1) si (num == 1): print ("Entrez un entier supérieur à 1") Elif (num> 1): a = collatz (num) while (True): si (a == 1): Pause autre: a = collatz (a) autre: print ("Veuillez entrer un entier positif pour commencer la séquence de Collatz") sauf: print ("s'il vous plaît, entrez un entier")
Essayez de trouver une solution basée sur jusqu’au chapitre Fonction d’automatiser les tâches ennuyeuses. Si vous avez besoin d’aide concernant Collatz Problem, visitez ici: http://mathworld.wolfram.com/CollatzProblem.html
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.')
C’est ce que j’ai moi-même proposé et fondé sur ce que j’ai appris jusqu’à présent dans le livre. Cela m'a pris un peu, mais l'un des outils que j'ai utilisés et qui m'a été précieux pour trouver ma solution et aussi pour apprendre ce contenu est l'outil de visualisation Python à l'adresse: http://www.pythontutor.com/visualize .html # mode = edit
J'ai pu voir ce que mon code faisait et où il était en train de s'accrocher, et j'étais capable de faire des ajustements continuels jusqu'à ce que tout soit correct.
Je pense que cette solution est peut-être encore plus simple pour les apprenants que celle acceptée:
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)
Le résultat ressemblera à ceci:
Enter a number: 5
16
8
4
2
1
je lis le même cours et j'ai fait une très longue solution (en l'améliorant quand j'apprends quelque chose de nouveau). Je suggère de garder votre programme collatz à jour au fur et à mesure de votre progression dans les chapitres, ce qui en fait une bonne formation. le mien a la manipulation de chaîne et l'enregistrement dans un\collatzrecords.txt maintenant!
J'ai résolu le problème principal en utilisant la récursivité (une méthode s'appelle elle-même):
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))
le spam est ma liste pour toutes les valeurs qu'un nombre "voit" sur le chemin de 1 . comme vous pouvez le voir, quand le nombre est même l'éthod est appelé agin avec le nombre/2 si le numéro est pair, il est appelé avec le numéro * 3 + 1.
modifié le nombre == 1 vérification un bit. J'espère que cela vous fera gagner du temps de calcul - jusqu'à 23 000 000 déjà! (enregistrement actuel est 15 733 191 avec 704 étapes pour l'obtenir à 1)
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')
C'est ce que j'ai proposé pour cet exercice d'entraînement . Il demande une entrée Valide s'il s'agit d'un entier. Sinon, il réprimande et quitte. Si c'est le cas, il parcourt la séquence collatz jusqu'à ce que le résultat soit égal à 1 et vous gagnez.
Mon code
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')
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')
J'ai ajouté la validation d'entrée