Thoughts And Question When Implementing Animation Plot Of Collatz Conjecture (3X+1)
Solution 1:
I have rewritten your code (works on my machine), and will try to answer your questions
You cannot start from an empty list for y
because the collatz()
function needs a starting point. Hence, if y
is empty, there is nothing to start from and the function fails. In the new code below I have added a parameter start
to your function (in the code: 49). This is now the new starting point of your function. Note that if you want a random starting point instead of one defined by you, you can delete start, and replace y = [start]
with y = [int(np.random.randint(1, 100, 1))]
or another code that draws a random integer.
Now collatz uses a while loop: it works as long as y is larger than 1 (hence for y = 0 or 1 it will stop). Note that the -1 operator means 'the last element added to y'. For each number it does the even()
or odd()
function, and then it adds the number to the list using append
. This ensures that the list is only as long as it needs to be. Note that in this case a while loop is the best option since you don't know how long the loop will last. When you have a fixed amount of iterations, a for loop should be chosen.
Finally, x is determined based on the length of y.
from matplotlib.animation import FuncAnimation
from matplotlib import pyplot as plt
def odd(num):
return (num*3)+1
def even(num):
return num // 2
def collatz(start):
y = [start]
while y[-1] > 1:
if y[-1] % 2 == 0:
y.append(even(y[-1]))
else:
y.append(odd(y[-1]))
return y
y = collatz(49)
x = list(range(len(y)))
fig = plt.figure()
plt.xlim(1,len(y))
plt.ylim(1,max(y))
draw, = plt.plot([],[])
def update(idx):
draw.set_data(x[:idx], y[:idx])
return draw
a = FuncAnimation(fig, update, frames=len(x), interval=90)
plt.show()
Post a Comment for "Thoughts And Question When Implementing Animation Plot Of Collatz Conjecture (3X+1)"