Een collatz-programma maken om de saaie dingen te automatiseren

Ik probeer een Collatz-programma te schrijven met behulp van de richtlijnen van een project aan het einde van hoofdstuk 3 van Automatiseer de saaie dingen met Python. Ik gebruik python 3.4.0. Hieronder volgt het projectoverzicht:

Schrijf een functie met de naam collatz()die één parameter heeft met de naam number. Als het getal even is, moet collatz()number // 2afdrukken en deze waarde retourneren. Als het getal oneven is, moet collatz()afdrukken en 3 * number + 1retourneren. Schrijf vervolgens een programma waarmee de gebruiker een geheel getal kan typen en dat collatz()blijft aanroepen op dat getal totdat de functie de waarde 1retourneert.

De uitvoer van dit programma zou er ongeveer zo uit kunnen zien:

Enter number: 3 10 5 16 8 4 2 1 

Ik probeer een functie te maken die gebruikmaakt van ifen elifstatements binnen een while-lus. Ik wil dat het nummer wordt afgedrukt en vervolgens terugkeert naar het begin van de lus en zichzelf reduceert tot één met behulp van de Collatz-reeks, waarbij elke instantie van een resulterend nummer wordt afgedrukt terwijl het door de lus gaat. Met mijn huidige code kan ik alleen het eerste exemplaar van het nummer afdrukken en dat nummer gaat daarna niet door de lus. Hieronder volgt mijn 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)

Antwoord 1, autoriteit 100%

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

Uitvoer:

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

Antwoord 2, autoriteit 16%

Dit is wat ik heb bedacht:

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!

Antwoord 3, autoriteit 9%

Uw collatz()FUNCTION MOET PRINT & AMP; retourneer alleen de volgende waarde. (Het eindigt wanneer het terugkeert.)

De whilelus niet in de collatz()-functie mogen zijn.

U hebt ook inconsistente variabele namen (n, number, nnumber), en een belangrijke code wordt becommentarieerd.


Antwoord 4, Autoriteit 9%

Mijn 17 regels code voor dezelfde oefening waarmee ik heb bedacht.

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

Antwoord 5, Autoriteit 3%

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

Dit is wat ik zelf heb bedacht en uitsluitend gebaseerd op wat ik tot nu toe uit het boek heb geleerd. Het kostte me wat tijd, maar een van de tools die ik gebruikte die van onschatbare waarde was voor mij om mijn oplossing te vinden en die ook van onschatbare waarde is geweest bij het leren van deze inhoud, is de Python visualizer-tool op: http://www.pythontutor.com/visualize.html#mode=edit

Ik kon zien wat mijn code aan het doen was en waar het werd opgehangen en ik kon voortdurend aanpassingen maken totdat ik het goed had.


Antwoord 6, autoriteit 3%

ik ben dezelfde cursus aan het lezen en ik heb een hele lange oplossing gemaakt (verbeteren als ik iets nieuws leer). ik raad aan om je collatz-programma up-to-date te houden naarmate je verder komt in de hoofdstukken, het is een goede training. de mijne heeft stringmanipulatie en kan nu worden opgeslagen in een \collatzrecords.txt!

Ik heb het kernprobleem opgelost door recursie te gebruiken (een methode roept zichzelf aan):

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 is mijn lijst voor alle waarden die een getal ‘ziet’ op weg naar 1.
zoals je kunt zien, wanneer het getal even is, wordt de ethod agin genoemd met getal/2. als het nummer even is, wordt het gebeld met nummer*3+1.

het nummer == 1 vinkje een beetje aangepast. ik hoop dat het rekentijd bespaart – ik heb al 23 000 000! (huidige record is 15 733 191 met 704 stappen om het op 1) te krijgen


Antwoord 7, autoriteit 3%

Ik heb het goed gedaan zonder return-statements te gebruiken en heb een while-lus in de functie genest.

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)

Antwoord 8, Autoriteit 3%

Ik heb het proberen toegevoegd en behalve dit (met een pauze)

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

Antwoord 9

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)

Antwoord 10

mijn 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')

Antwoord 11

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

Dit is wat ik bedacht voor deze oefenoefening.
Het vraagt om een input
Valideert of het een geheel getal is. Zo niet, dan berispt het en gaat het weg. Als dat zo is, loopt het door de collatz-reeks totdat het resultaat 1 is en dan win je.


Antwoord 12

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

Ik heb invoervalidatie toegevoegd


Antwoord 13

Elke oplossing in deze thread mist één ding: als de gebruiker “1” invoert, zou de functie nog steeds de berekeningen van de Collatz-reeks moeten uitvoeren. Mijn oplossing:

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

Antwoord 14

def collatz(getal):
  if(getal%2==0):
    n=getal//2
    print(n)
    retour n
  anders:
    ev=3*getal+1
    afdrukken (ev)
    keer terug
num1=input("Voer een getal in: \n")
proberen:
  aantal= int(getal1)
  if(getal==1):
    print("Vul een geheel getal in groter dan 1")
  elif(getal>1):
    a=collatz(getal)
    terwijl (waar):
      als(a==1):
        pauze
      anders:
        a=collatz(a)
  anders:
    print("Voer een positief geheel getal in om de Collatz-reeks te beginnen")
behalve:
  print("alstublieft, voer een geheel getal in")

Probeer een oplossing te bedenken op basis van hoofdstuk Functie van het saaie gedoe automatiseren.
Als je hulp nodig hebt met betrekking tot het Collatz-probleem, bezoek dan hier:
http://mathworld.wolfram.com/CollatzProblem.html


Antwoord 15

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

Antwoord 16

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

De extra while True-lus helpt het programma te blijven functioneren nadat de gebruiker een niet-geheel getal heeft ingevoerd.


Antwoord 17

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

Antwoord 18

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:')

Antwoord 19

Hier is mijn 19 regels:

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

Antwoord 20

Ik denk dat deze oplossing zelfs eenvoudiger kan zijn voor leerlingen dan de geaccepteerde:

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)

Het resultaat zal zoiets als volgt:

Enter a number: 5
16
8
4
2
1

Antwoord 21

Nuncjo heeft de oplossing die werkt. Ik heb het een beetje aangepast om try-and-behalve-statements toe te voegen voor foutafhandeling.

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

Antwoord 22

14 regels:

Begrijp je niet waarom we “elif number %2 == 1:” nodig hebben in plaats van eenvoudig ‘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)

Antwoord 23

Ik had moeite om de logica van deze oefening te begrijpen.
maar ik weet niet wat ik verkeerd heb gedaan om de fout weer te geven als we een negatief getal hebben.

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
while True:
try:
    entry = input('enter a positive number: ')
    while entry != 1:
        entry = collatz(int(entry))
    # if we have a negative number
    while entry < 1:
        break
except ValueError:
    print('Error, enter valid number')

Antwoord 24

def cyclic(number):
    if number % 2 == 0:
        if number // 2 == 1:
            print(1)
        else:
            print(number//2)
            cyclic(number // 2)
    else:
        print((number * 3) + 1)
        cyclic((number * 3) + 1)
print("Enter a number:")
try:
    n = int(input())
    cyclic(n)
except ValueError:
    print("Unvalied value")

De eenvoudigste


Antwoord 25

U kunt dit eenvoudig proberen

while True:
 number=int(input('Enter next positive number or 0 to quit: '))
 iteration=0
 currentNumber=0
 item=1
 sumOfNumbers=0
 print(number,end='  ')
 if(number):
    while currentNumber !=1 :
        currentNumber=int(number/2) if(number%2==0) else number*3+1
        number=currentNumber
        iteration +=1; item +=1
        sumOfNumbers +=currentNumber
        print(currentNumber,end ='\n' if(item %5==0) else '  ')
    print('\nIt took ',iteration,'iterations to arrive at 1')
    print('The average  is ',round((sumOfNumbers/iteration),2))
 else :
    break

Antwoord 26

  1. In uw programma (vraag), nadat Return-instructie wordt uitgevoerd, wordt doorgaan, wordt doorgegaan. dus het loopt voor slechts één iteratie.

  2. Uw programma werkt niet voor invoer-integer 1. Mogelijk wilt u het resultaat van de methode met 1 controleren, mag de gebruikerinvoer niet in het begin zelf controleren. 1 is ook een geldige invoer aan het programma.

  3. Methoden zouden de voorkeur hebben om één actie uit te voeren. (Vaste principes van programmering). Beter om functie in een lus te bellen in plaats van de inning van de binnenfunctie. verhoogt de herbruikbaarheid van de methode.

def collatz(number):
    if number % 2 == 0:
        print(number // 2)              # logically, floor division is equivalent to division when even number with 2
        return number // 2
    elif number % 2 != 0:
        print(number * 3 + 1)
        return number * 3 + 1
number = int(input("Please enter a number\n"))
result = collatz(number)                # this way the program also takes 1 as input
while result != 1:
    result = collatz(result)
# Output:
Please enter a number
1
4
2
1
Please enter a number
32
16
8
4
2
1

Other episodes