Collatz序列

编写一个名为collatz()的函数,它有一个名为number 的参数。如果参数是偶数,那么collatz()就打印出number// 2,并返回该值。如果number 是奇数,collatz()就打印并返回3 * number + 1。然后编写一个程序,让用户输入一个正整数,并不断对这个数调用collatz(),直到函数返回值1

1. 考虑了0、负数、小数、字母

但是小数为啥会走到except,很费解(更新,见5)

2. 输错的话提示重新输入,并重新进入循环

一不小心开始了套娃..

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


def inputNun():
    try:
        number = int(input())
        while number != 1 and number > 1:
            number = collatz(number)
        if number == 1:
            pass
        if number < 1:
            print("Enter a int and higher than 0")
            inputNun()
    except ValueError:
        print("Enter a int and higher than 0")
        inputNun()

inputNun()
print("Done")

3. 负数也有奇偶,所以当输入-2时走到异常里就不严谨,想了一下,可以用绝对值来处理负数

4. 0会无限循环、1不需要参加运算,所以0和1都不需要进入collatz函数,

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


def inputNun():
    try:
        number = abs(int(input()))
        while number != 1 and number != 0: #不能写成number !=1 and 0
            number = collatz(number)
    except ValueError:
        print("Please enter a int:")
        inputNun()

inputNun()
print("Done")

5. number = int(input())时,输入浮点数,会给出ValueError: invalid literal for int() with base 10: '3.14'的错误提示

在input外层加上eval或者float可以解决

但如果用eval,就需要吧指定的错误ValueEroor去掉,直接except

【大概也许可能是最终版了吧.....】

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


def inputNun():
    try:
        number = abs(int(float(input())))
        while number not in(0, 1):
            number = collatz(number)
    except:
        print("Please enter a int:")
        inputNun()

inputNun()
print("Done")
原文地址:https://www.cnblogs.com/p36606jp/p/15113940.html