制作一个collat​​z程序可以自动化无聊的东西

Del*_*yer 14 python python-3.4

我正在尝试使用Python自动化无聊的第3章末尾的项目指南编写一个collat​​z程序.我正在使用python 3.4.0.这是项目大纲:

编写一个名为collat​​z()的函数,它有一个名为number的参数.如果number为偶数,则collat​​z()应打印数字// 2并返回此值.如果number是奇数,那么collat​​z()应该打印并返回3*number + 1.然后编写一个程序,让用户输入一个整数,并继续在该数字上调用collat​​z(),直到函数返回值1.

该程序的输出可能如下所示:输入数字:3 10 5 16 8 4 2 1

我试图在while循环中创建一个使用if和elif语句的函数.我希望打印数字,然后返回到循环的开头并使用collat​​z序列将其自身缩减为1,结果数字的每个实例在循环时打印.使用我当前的代码,我只能打印该数字的第一个实例,之后该数字不会通过循环.这是我的代码:

Enter number: 3 10 5 16 8 4 2 1 
Run Code Online (Sandbox Code Playgroud)

Nun*_*cjo 20

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))
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 超声波这个关于递归的SO帖子是你真正需要知道的./sf/ask/2345562411/​​z-program-automate-the-boring-stuff (2认同)
  • 可使代码更整洁的两件事:在colatz之外的print(n),在读取输入后仅转换为int一次 (2认同)

ubu*_*ows 5

这是我想出的:

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!
Run Code Online (Sandbox Code Playgroud)