web-dev-qa-db-fra.com

Faire un programme collatz automatise les trucs ennuyeux

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)
12
DeltaFlyer
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
14
Nuncjo

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!
4
ubundows

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.

2
Jonathan Clede

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.')
2
Simas
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
Tossaire
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.

0
zheng yang
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
Dylan

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.')
0
toonarmycaptain

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')
0
stevensonmt

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.')
0
doc_gunthrop
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
Maecenas
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
Subterranean
 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

0
Md. Raihan
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.

0
Ryan Hallberg

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
0
Noob

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)

0
Turun ambartanen
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. 

0
Christopher Wales

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')
0
Jebin
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

0
LuckyMiv