Collat​​z序列。 (Python 3)

时间:2015-10-24 23:26:01

标签: python python-3.x

我已经开始了这本书"Automate The Boring Stuff" by Al Sweigart

在第3章的最后,作者建议在Python中创建一个Collat​​z序列作为练习练习。 (练习练习建议我使用print函数和return语句)

当我在代码中使用print()函数时,它运行良好,我得到了我想在屏幕上看到的所有评估值:

print("This is The Collatz Sequence")
user = int(input("Enter a number: "))


def collatz(n):
    print(n)
    while n != 1:
        if n % 2 == 0:
            n = n // 2
            print(n)
        else:
            n = n * 3 + 1
            print(n)


collatz(user)

问题:
为什么我想使用return语句,while循环只运行一次?

例如,使用return语句将整数3传递给我的函数只能得到return值3和10:

print("This is The Collatz Sequence")
user = int(input("Enter a number: "))


def collatz(n):
    print(n)
    while n != 1:
        if n % 2 == 0:
            n = n // 2
            return n
        else:
            n = n * 3 + 1
            return n


result = collatz(user)
print(result)

3 个答案:

答案 0 :(得分:3)

return退出该功能,因此会终止您的while循环。

也许您打算使用yield代替:

print("This is The Collatz Sequence")
user = int(input("Enter a number: "))

def collatz(n):
    print(n)
    while n != 1:
        if n % 2 == 0:
            n = n // 2
            yield(n)
        else:
            n = n * 3 + 1
            yield(n)

print(list(collatz(user)))

输出:

This is The Collatz Sequence
Enter a number: 3
3
[10, 5, 16, 8, 4, 2, 1]

Yield在逻辑上类似于return,但在到达定义的return或函数末尾之前,函数不会终止。执行yield statement时,将暂停生成器函数,并将yield expression的值返回给调用者。一旦调用者完成(并且可以使用已发送的值),执行就会在yield语句之后立即返回到生成器函数。

答案 1 :(得分:1)

在您的代码中,您不会将新值重新提供给等式。尝试将while循环与collat​​z模块分开。我有一个这样的例子:

def collatz(number):
    if number % 2 == 0:
        return number // 2
    elif number % 2 == 1:
        return 3 * number + 1

chosenInt = int(input('Enter an integer greater than 1: '))

print(chosenInt)

while chosenInt != 1:
    chosenInt = collatz(chosenInt)
    print(chosenInt)

答案 2 :(得分:0)

def collatz(number):
if (number%2 == 0):
    return print(number//2);
else:
    return (print(number*3+1));

inputNumber = input("Enter a number greater than 1:");
result = collatz(int(inputNumber));
while result != 1:
    result = collatz(result);

我收到一个typeError!不知道为什么吗?