【问题标题】:How does one make a python turtle to draw outputs of the collatz sequence in a line graph?如何让 python 乌龟在折线图中绘制 collatz 序列的输出?
【发布时间】:2020-06-13 21:38:47
【问题描述】:
def next_term(num):
if num<=0:
print("Zero or negative numbers are not even, nor Odd.","Enter number >",num)
else:
print(int(num))
while num!=1: #number is even
if num%2==0:
num=num/2
else:
num=(num*3)+1 #number is odd
print(int(num))
def main():
nani=int(input("Please enter number: "))
next_term(nani)
if __name__=="__main__":
main()
【问题讨论】:
标签:
python
turtle-graphics
linegraph
collatz
【解决方案1】:
所有你需要的只是一些调整,所有的调整都是评论:
import turtle # Import turtle
size = 20 # Set the size of each number
def next_term(num):
if num<=0:
print("Zero or negative numbers are not even, nor Odd.","Enter number >",num)
else:
print(int(num))
while num!=1:
if num%2==0:
num=num/2
else:
num=(num*3)+1
turtle.write(int(num),font=("Arial",size,"normal")) # Instead of print(), use turtle.write()
turtle.forward(len(str(int(num)))*size) # After writing the number, go forward by the amount of digits in the number multiplied by a unit
def main():
nani=int(input("Please enter number: "))
next_term(nani)
if __name__=="__main__":
main()
输出:
>>>
Please enter number: 10
10
>>>
这是一种更简洁的方法:
import turtle
size = 20
def collatz(num):
while num != 1:
if num % 2:
num = num*3+1
else:
num = num // 2
turtle.write(num,font=("Arial",size,"normal"))
turtle.forward(len(str(num))*size)
def main():
nani = int(input("Please enter number: "))
collatz(nani)
if __name__=="__main__":
main()
【解决方案2】:
您的问题需要更加具体,因为有 很多 种方法可以绘制 Collatz 数。例如,下面的代码绘制了一个输入值在到达1 的过程中所经过的各种数字的折线图:
from turtle import Screen, Turtle
def collatz(number):
yield number
while number != 1:
if number % 2 == 0: # number is even
number //= 2
else:
number = number * 3 + 1 # number is odd
yield number
def graph_terms(generator):
screen = Screen()
turtle = Turtle()
turtle.hideturtle()
terms = [n for n in generator] # exhaust generator as we need len() and max()
x_max, y_max = len(terms), max(terms)
x_step = screen.window_width() / 2 / x_max
y_step = screen.window_height() / 2 / y_max
turtle.setheading(90)
turtle.forward(y_max * y_step)
turtle.backward(y_max * y_step)
turtle.setheading(0)
for _ in range(2):
turtle.pendown()
turtle.forward(x_max * x_step)
turtle.backward(x_max * x_step)
turtle.penup()
turtle.color('red')
turtle.sety(y_step)
turtle.home()
turtle.color('black')
for step, term in enumerate(terms):
turtle.goto(step * x_step, term * y_step)
turtle.pendown()
turtle.dot()
screen.exitonclick()
def main():
number = int(input("Please enter number: "))
try:
generator = collatz(number)
graph_terms(generator)
except StopIteration:
pass
if __name__ == "__main__":
main()
这是数字25的图表:
在我的代码中,我将您的 Collatz 数字函数重新设计为一个看起来像它想要的样子的生成器。但是,出于绘图目的,我会立即耗尽生成器,因为我需要序列的长度和最大值,因此在这种情况下生成器不会得到回报。
如果这是您正在寻找的折线图样式,那么完成这个极简代码对您来说仍然是一个练习:它需要在屏幕上居中;它需要在其轴上打印数字;等等