Python3 中的 Collat​​z 猜想函数在分配给变量时调用自身

Collatz conjecture function in Python3 calling itself when being assigned to a variable

我正在阅读 Al Sweigart 的《使无聊的东西自动化》一书开始学习Python(在线免费,如果您有兴趣可以查看,或者您认为它将有助于解决我的问题)。在第 3 章末尾,您将获得一个练习,创建一个可以执行 Collat​​z 猜想的程序。我已经成功创建了一个函数,它接受一个输入整数并将其除以 2 或乘以 3,然后分别为偶数和奇数加 1。

问题来了,当我尝试获取函数返回的值并将其分配给一个变量(这样我就可以创建一个循环,当数字达到 1 时停止),它反而调用了函数,当我尝试在 while 循环中使用该函数时,它 returns 一个 None 值。

我尝试将它与其他模拟神奇 8 球的程序进行比较,因为我制作 Collat​​z 程序的方式与 8 球非常相似,但不知何故 8 球确实有效,而 Collat​​z 没有,而且由于我目前没有想法,我问你是否可以注意到我的代码中的任何拼写错误,这些拼写错误可能表明发生这种情况的原因。

提前感谢您的时间和精力。 PS: 别忘了喝点水,这对你有好处<3

代码:

1.-Collat​​z(不包括 while 循环)

import random
even = range(0, 1001, 2)


def collatz(number):
    if number in even:
        print(number // 2)
        return
    else:
        print(3 * number + 1)
        return

startNumber = int(input())
newNumber = collatz(startNumber)

2.- 8 球

import random

def getAnswer(x):
    if x == 1:
        return 'It is certain'
    elif x == 2:
        return 'It is decidedly so'
    elif x == 3:
        return 'Yes'
    elif x == 4:
        return 'Reply hazy try again'
    elif x == 5:
        return 'Ask again later'
    elif x == 6:
        return 'Concentrate and ask again'
    elif x == 7:
        return 'My reply is no'
    elif x == 8:
        return 'Outlook not so good'
    elif x == 9:
        return 'Very doubtful'

r = random.randint(1, 9)
fortune = getAnswer(r)
print(fortune)

3.- 根据书中的提示制作的 Collat​​z(包括 while 循环)

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

startNumber = int(input())

while startNumber != 1:
    collatz(startNumber)
    newNumber = collatz(startNumber)
    collatz(newNumber)

另外,附上本书的SS,以备不时之需 enter image description here

您有未使用的变量,您需要为 collatz() 定义一个 return 值。

现在,您定义了一个变量 newNumber,但永远不要在代码中的任何地方使用它。您应该改为更新 startNumber(为了便于阅读,在下面重命名为 num)。您还需要为 collatz() 定义一个 return 值;否则,它将 return None,这不是问题所要求的。

这是解决这些问题的解决方案。

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

num = int(input())
while num != 1:
    num = collatz(num)