一个人如何使python乌龟在折线图中绘制collat z序列的输出?

问题描述 投票:-3回答:2
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
2个回答
0
投票

您需要做的只是一些调整,所有的调整都被注释:

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
>>> 

turtle-graphics

这里是一种更清洁的方法:

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()

0
投票

您需要在问题中更具体,因为有lots>]种方式绘制Collat​​z数字。例如,下面的代码绘制了输入值到达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的图形:

enter image description here

在我的代码中,我将您的Collat​​z数字函数重新构造为一个生成器,看起来像它想要的那样。但是,出于制图目的,由于需要序列的长度和最大值,因此我立即用尽了生成器,因此生成器在这种情况下无法获得回报。

如果这是您要寻找的折线图样式,那么完成此极简代码仍然是您的练习:您需要将其放在屏幕中央;它需要在其轴上印刷数字;等

© www.soinside.com 2019 - 2024. All rights reserved.