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 // 2
afdrukken en deze waarde retourneren. Als het getal oneven is, moet collatz()
afdrukken en 3 * number + 1
retourneren. 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 1
retourneert.
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 if
en elif
statements 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 while
lus 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
-
In uw programma (vraag), nadat Return-instructie wordt uitgevoerd, wordt doorgaan, wordt doorgegaan. dus het loopt voor slechts één iteratie.
-
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.
-
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