我的 3x+1 可视化程序出现无法解释的崩溃
unexplained crash in my 3x+1 visualization program
这是我的第一个论坛 post,我对编码还很陌生。
我的代码有问题。我最近在 YouTube 上观看了 Veritasium 的一段视频,他在视频中谈到了 3x+1 定理。我决定用我新学到的知识做一些有趣的事情,并使用 python 和 turtle 制作一个可视化工具。但是,每次我 运行 它时,网页(我为此使用 Codehs)都会冻结。这是我的代码。
highestnum = 1
numchosen = int(input("starting number? "))
rounds = 1
def odd(num):
return (num*3)+1
def even(num):
return num*2
while True:
if numchosen%2 == 0:
numchosen = even(numchosen)
else:
numchosen = odd(numchosen)
if numchosen > highestnum:
highestnum = numchosen
if numchosen == 1:
break
print("highest number: " + str(highestnum))
print("number of changes: " + str(rounds))
请只回答我说的这个崩溃,而不是我应该做的任何优化。
您的 even
函数需要除以 2,而不是乘法。使用 //
运算符进行整数除法(以避免浮点结果):
def even(num):
return num // 2
原来的代码是乘法而不是除法,所以这个值呈指数增长,没有尽头。
此问题称为 Collatz Conjecture。
在 (def even) 中,您需要将偶数除以 2 才能得到 3x + 1 等式。
所以问题的改进版本将是:
highestnum = 1
numchosen = int(input("starting number? "))
rounds = 1
def odd(num):
return (num*3)+1
def even(num):
return num // 2
while True:
if numchosen%2 == 0:
numchosen = even(numchosen)
else:
numchosen = odd(numchosen)
if numchosen > highestnum:
highestnum = numchosen
if numchosen == 1:
break
print("highest number: " + str(highestnum))
print("number of changes: " + str(rounds))
这是我的第一个论坛 post,我对编码还很陌生。
我的代码有问题。我最近在 YouTube 上观看了 Veritasium 的一段视频,他在视频中谈到了 3x+1 定理。我决定用我新学到的知识做一些有趣的事情,并使用 python 和 turtle 制作一个可视化工具。但是,每次我 运行 它时,网页(我为此使用 Codehs)都会冻结。这是我的代码。
highestnum = 1
numchosen = int(input("starting number? "))
rounds = 1
def odd(num):
return (num*3)+1
def even(num):
return num*2
while True:
if numchosen%2 == 0:
numchosen = even(numchosen)
else:
numchosen = odd(numchosen)
if numchosen > highestnum:
highestnum = numchosen
if numchosen == 1:
break
print("highest number: " + str(highestnum))
print("number of changes: " + str(rounds))
请只回答我说的这个崩溃,而不是我应该做的任何优化。
您的 even
函数需要除以 2,而不是乘法。使用 //
运算符进行整数除法(以避免浮点结果):
def even(num):
return num // 2
原来的代码是乘法而不是除法,所以这个值呈指数增长,没有尽头。
此问题称为 Collatz Conjecture。
在 (def even) 中,您需要将偶数除以 2 才能得到 3x + 1 等式。
所以问题的改进版本将是:
highestnum = 1
numchosen = int(input("starting number? "))
rounds = 1
def odd(num):
return (num*3)+1
def even(num):
return num // 2
while True:
if numchosen%2 == 0:
numchosen = even(numchosen)
else:
numchosen = odd(numchosen)
if numchosen > highestnum:
highestnum = numchosen
if numchosen == 1:
break
print("highest number: " + str(highestnum))
print("number of changes: " + str(rounds))