Python 制作一个collatz程序使无聊的事情自动化

Python 制作一个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:

我正试图使用《用Python自动化无聊的东西》第3章末尾的一个项目的指导方针编写一个Collatz程序。我正在使用python
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