Collat​​z 序列 - 我做对了吗?

Collatz sequence - Have I done it right?

我现在正在学习如何在 python 中编程,我正在学习的书给了我构建这个序列并将其置于循环中直到值为 1 的练习项目。

我的代码如下所示:

print('Enter a number')
number = input()
num = number

def collatz(number):
    global num
    if int(num) % 2 == 0:
        num = int(num) // 2
        print(str(num))
    elif int(num) % 2 == 1:
        num = 3 * int(num) + 1
        print(str(num))
while num != 1:
    number = num
    collatz(number)

它有效,但我不确定我是否按照我应该的方式完成了它。 我的问题是我将数字同时用作全局变量和参数,当我第一次编写代码时,每个 'num' 都被调用 'number',当第一次测试它时,它会进入无限循环并重复首先 if 或 elif 重新开始。我认为问题是它没有引用全局变量而是创建了一个本地变量,所以我试图在开始时声明使用全局变量,正如你所看到的,但是它没有让我因为全局变量和参数不能相同,所以我创建了 'num' 变量并将其分配给 if 块,但现在看起来数字参数并没有真正干扰我的代码。

它有效的事实让我很高兴,但我想确认这是正确的。

我建议您解决一些问题。

  • input 不需要单独的 print。现在也可以将其转换为 int。

    number = int(input('Enter a number'))

  • 摆脱全局并使用return。也去掉你在函数中的转换。

参见:

def collatz(n): # parameter is an int
    if n % 2 == 0:
        n = n // 2
    elif n % 2 == 1:
        n = 3 * n + 1
    print(n) # single print
    return n

所以合并:

def collatz(n):
    if n % 2 == 0:
        n = n // 2
    elif n % 2 == 1:
        n = 3 * n + 1
    print(n)
    return n
number = int(input('Enter a number'))
while number != 1:
    number = collatz(number)