Python3 中的 Collatz 猜想函数在分配给变量时调用自身
Collatz conjecture function in Python3 calling itself when being assigned to a variable
我正在阅读 Al Sweigart 的《使无聊的东西自动化》一书开始学习Python(在线免费,如果您有兴趣可以查看,或者您认为它将有助于解决我的问题)。在第 3 章末尾,您将获得一个练习,创建一个可以执行 Collatz 猜想的程序。我已经成功创建了一个函数,它接受一个输入整数并将其除以 2 或乘以 3,然后分别为偶数和奇数加 1。
问题来了,当我尝试获取函数返回的值并将其分配给一个变量(这样我就可以创建一个循环,当数字达到 1 时停止),它反而调用了函数,当我尝试在 while 循环中使用该函数时,它 returns 一个 None
值。
我尝试将它与其他模拟神奇 8 球的程序进行比较,因为我制作 Collatz 程序的方式与 8 球非常相似,但不知何故 8 球确实有效,而 Collatz 没有,而且由于我目前没有想法,我问你是否可以注意到我的代码中的任何拼写错误,这些拼写错误可能表明发生这种情况的原因。
提前感谢您的时间和精力。
PS: 别忘了喝点水,这对你有好处<3
代码:
1.-Collatz(不包括 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.- 根据书中的提示制作的 Collatz(包括 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)
我正在阅读 Al Sweigart 的《使无聊的东西自动化》一书开始学习Python(在线免费,如果您有兴趣可以查看,或者您认为它将有助于解决我的问题)。在第 3 章末尾,您将获得一个练习,创建一个可以执行 Collatz 猜想的程序。我已经成功创建了一个函数,它接受一个输入整数并将其除以 2 或乘以 3,然后分别为偶数和奇数加 1。
问题来了,当我尝试获取函数返回的值并将其分配给一个变量(这样我就可以创建一个循环,当数字达到 1 时停止),它反而调用了函数,当我尝试在 while 循环中使用该函数时,它 returns 一个 None
值。
我尝试将它与其他模拟神奇 8 球的程序进行比较,因为我制作 Collatz 程序的方式与 8 球非常相似,但不知何故 8 球确实有效,而 Collatz 没有,而且由于我目前没有想法,我问你是否可以注意到我的代码中的任何拼写错误,这些拼写错误可能表明发生这种情况的原因。
提前感谢您的时间和精力。 PS: 别忘了喝点水,这对你有好处<3
代码:
1.-Collatz(不包括 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.- 根据书中的提示制作的 Collatz(包括 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)