【问题标题】:How does one make a python turtle to draw outputs of the collatz sequence in a line graph?如何让 python 乌龟在折线图中绘制 collat​​z 序列的输出?
【发布时间】: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】:

      您的问题需要更加具体,因为有 很多 种方法可以绘制 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的图表:

      在我的代码中,我将您的 Collat​​z 数字函数重新设计为一个看起来像它想要的样子的生成器。但是,出于绘图目的,我会立即耗尽生成器,因为我需要序列的长度和最大值,因此在这种情况下生成器不会得到回报。

      如果这是您正在寻找的折线图样式,那么完成这个极简代码对您来说仍然是一个练习:它需要在屏幕上居中;它需要在其轴上打印数字;等等

      【讨论】:

        猜你喜欢
        • 2023-03-28
        • 2019-07-25
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 2022-01-06
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        相关资源
        最近更新 更多