Python 制作一个collatz程序使无聊的事情自动化
我正试图使用《用Python自动化无聊的东西》第3章末尾的一个项目的指导方针编写一个Collatz程序。我正在使用pythonPython 制作一个collatz程序使无聊的事情自动化,python,python-3.4,Python,Python 3.4,我正试图使用《用Python自动化无聊的东西》第3章末尾的一个项目的指导方针编写一个Collatz程序。我正在使用python3.4.0。项目概要如下: 编写一个名为collatz()的函数,该函数有一个名为number的参数。如果数字为偶数,则collatz()应打印number//2并返回此值。如果数字为奇数,则应打印并返回3*number+1。然后编写一个程序,让用户输入一个整数,并对该数字不断调用collatz(),直到函数返回值1 此程序的输出可能如下所示: Enter number:
3.4.0
。项目概要如下:
编写一个名为collatz()
的函数,该函数有一个名为number的参数。如果数字为偶数,则collatz()
应打印number//2
并返回此值。如果数字为奇数,则应打印并返回3*number+1
。然后编写一个程序,让用户输入一个整数,并对该数字不断调用collatz()
,直到函数返回值1
此程序的输出可能如下所示:
Enter number: 3 10 5 16 8 4 2 1
Enter a number: 5
16
8
4
2
1
我试图创建一个函数,在while循环中使用if
和elif
语句。我希望打印数字,然后返回到循环的开头,并使用Collatz序列将其自身缩减为一,结果数字的每个实例在循环中打印。使用我当前的代码,我只能打印该数字的第一个实例,之后该数字不会通过循环。以下是我的代码:
#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)
您的collatz()
函数应该只打印并返回下一个值。(返回时结束。)
while
循环不应位于collatz()
函数内
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)
还有不一致的变量名(n
,number
,nnumber
),一些重要的代码被注释掉了
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))
输出:
给我一个号码:3
10
5.
16
8.
4.
2.
1.
给我一个号码:11
34
17
52
26
13
40
20
10
5.
16
8.
4.
2.
1.
Nuncjo得到了有效的解决方案。我对它做了一些调整,添加了try和except语句来处理错误
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.')
这是我自己提出的,完全基于我从书中学到的东西。这花了我一点时间,但我使用的工具之一是python visualizer工具,该工具对我找到解决方案非常有用,在学习本内容时也非常有用,位于:
我能够看到我的代码在做什么,它在哪里被挂起,我能够不断地进行调整,直到我做对为止。def collatz(num):
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)
如果num%2:
返回3*num+1
其他:
returnnum//2
尽管如此:
尝试:
number=int(输入('输入一个正整数'))
如果号码是我的代码
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')
以下是我的想法:
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!
这就是我为这次练习所想到的。
它要求输入
验证它是否为整数。如果没有,它会责备并退出。如果是,它将在collatz序列中循环,直到结果为1,然后您获胜
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')
我添加了输入验证此线程上的每个解决方案都缺少一件事:如果用户输入“1”,则函数仍应运行Collatz序列的计算。我的解决方案:
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')
def collatz(编号):
如果(数字%2==0):
n=数字//2
打印(n)
返回n
其他:
ev=3*编号+1
打印(ev)
返回电动汽车
num1=输入(“输入一个数字:\n”)
尝试:
num=int(num1)
如果(num==1):
打印(“输入大于1的整数”)
elif(数值>1):
a=项圈(个)
虽然(正确):
如果(a==1):
打破
其他:
a=collatz(a)
其他:
打印(“请输入一个正整数以开始Collatz序列”)
除:
打印(“请输入一个整数”)
尝试提出一个解决方案,该解决方案基于自动化枯燥内容的最多一章功能。
如果需要与Collatz问题相关的帮助,请访问此处:
我正在读同一门课程,我提出了一个很长的解决方案(当我学到一些新东西时,我会改进它)。我建议随着你在章节中的进步,保持你的collatz课程是最新的,这是很好的训练。我的已进行字符串操作并保存到\collatzrecords.txt
我通过使用递归(方法本身调用)解决了核心问题:
垃圾邮件是我列出的数字“看到”到1的所有值的列表。
如您所见,当数字为偶数时,该方法被称为带有数字/2的agin。如果该数字为偶数,则使用数字*3+1进行调用
修改了数字==1,请检查一点。我希望它能节省计算时间-我已经达到2300000了!(当前记录为15733191,通过704个步骤达到1)
额外的while True循环将帮助程序在用户输入非整数后继续运行。def collatz(数字):
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.')
如果数字%2==0:
返回编号//2
elif编号%2==1:
返回3*number+1
尝试:
chosenInt=int(输入('输入大于1的整数:'))
而chosenInt<2:
打印(“对不起,您的号码必须大于1。”)
chosenInt=int(输入('输入大于1的整数:'))
印刷品(chosenInt)
而chosenInt!=1:
chosenInt=collatz(chosenInt)
印刷品(chosenInt)
除值错误外:
print('对不起,您必须输入一个整数')
以下是我的19行:
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.')
我认为,对于学习者来说,这种解决方案可能比公认的更简单:
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)
结果如下:
Enter number: 3 10 5 16 8 4 2 1
Enter a number: 5
16
8
4
2
1
我的17行代码与我提出的相同
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.')
我在不使用任何返回语句的情况下成功地实现了它,并在函数中嵌套了一个while循环
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)
我添加了“尝试”和“例外”这样的选项(有一个中断)
14行:
不明白为什么我们需要“elif number%2==1:”而不是简单的“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)
我很难理解这个练习的逻辑。
但我不知道如果我们有一个负数,我在显示错误时犯了什么错误
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')
def collatz(编号):
如果数字%2==0:
打印(编号//2)
返回编号//2
elif编号%2==1:
结果=3*数字+1
打印(结果)
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.')
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)
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
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)
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')
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")
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