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()
您需要做的只是一些调整,所有的调整都被注释:
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()
您需要在问题中更具体,因为有lots>]种方式绘制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数字函数重新构造为一个生成器,看起来像它想要的那样。但是,出于制图目的,由于需要序列的长度和最大值,因此我立即用尽了生成器,因此生成器在这种情况下无法获得回报。
如果这是您要寻找的折线图样式,那么完成此极简代码仍然是您的练习:您需要将其放在屏幕中央;它需要在其轴上印刷数字;等