pip install pyglot
代码:
import numpy as np
import matplotlib as plt
import matplotlib.pyplot as plt
import matplotlib.animation as animation
r = 1
theta = np.arange(0,6.4,0.1)
xCircle0 = np.cos(theta)
yCircle0 = 1+np.sin(theta)
fig = plt.figure(figsize=(15,4))
ax = fig.add_subplot(autoscale_on=False,
xlim=(1,10),ylim=(0,2))
ax.grid()
circle, = ax.plot(xCircle0,yCircle0,'-',lw=1)
point, = ax.plot([1],[1],'o')
trace, = ax.plot([],[],'-', lw=1)
theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes)
textTemplate = '''x = %.1f°\n'''
xs,ys = [], []
def animate(x):
if(x==0):
xs.clear()
ys.clear()
xCycloid = x + r*np.cos(-x) #由于是向右顺时针滚,所以角度为负
yCycloid = 1 + r*np.sin(-x)
xCircle = xCircle0+x
xs.append(xCycloid)
ys.append(yCycloid)
circle.set_data(xCircle,yCircle0)
point.set_data([xCycloid],[yCycloid])
trace.set_data(xs,ys)
theta_text.set_text(textTemplate % x)
return circle, point, trace, theta_text
frames = np.arange(0,10,0.02)
ani = animation.FuncAnimation(fig, animate, frames,
interval=5, blit=True)
ani.save("Cycloid.gif")
plt.show()
记着安装库
函数式程序
任务:你有一个值的序列和一些关于这些值的谓词。你想删除最长的元素前缀,使每个元素的谓词都为真。我们称这个为 dropWhile 函数。它接受两个参数。第一个是值的序列,第二个是谓词函数。该函数不会改变原始序列的值。
def isEven(num):
return num % 2 == 0
arr = [2,4,6,8,1,2,5,4,3,2] 。
dropWhile(arr, isEven) == [1,2,5,4,3,2] # True
你的任务是实现dropWhile函数。如果你身边有一个span函数,这就是一个单行本!或者,如果你有一个takeWhile函数,这就是一个单行本。或者,如果你手上有一个takeWhile函数,那么结合dropWhile函数,你可以在一行中实现span函数。这就是函数式编程的魅力所在:有一大堆有用的函数,其中许多都可以相互实现。
from itertools import dropwhile
def drop_while(arr, pred):
return list(dropwhile(pred, arr))
准确秤量任务
两个空烧杯容量是9升和11.25升:
C9AuEl812n.png容许用这些动作:
从水龙头处完全灌满一个容器
将一个容器内的水完全倒在地上
把一个容器倒入另一个容器中,直到它完全装满或倒入的那个容器完全空了为止,
你能准确地测量出以下哪一个数量?
提示:想一想你能测出的最小的量。四个选项有一是?
1.5升
3.25升
5升
6.75升
容许下面的操作:
99升的容器盛满水后,倒入11.2的容器。
再次填满9升的容器。接着将9升的容器倒入11.25的容器中,直到后者被装满。
这时,9升容器里还剩下6.75升,而另一个容器已经满了。正好测出6.75升。
解法
考虑两个比所给的容器大4倍的容器:
一个能容纳9×4=36升
另一个能容纳11.25×4=45升
如果我们能用这两个容器量出N升,那么我们就可以用原来的9升和11.25升的容器来测量 N/4升
我们可以用36升和45升的容器测量出的水的总量,其形式为
36x+45y
36x+45y
其中x和y是整数。如果x是正数,那么36升的容器就被装了x次。如果它是负数,那么36升的容器已经被清空了|x|次。y和45升容器的情况也是如此。
36x+45y的表达式必然是9的倍数,因为
36x=9(4x)
36x=9(4x)
和
45y=9(5y)。
45y=9(5y)。
也就是说,两个容器中的水的总量是9升的倍数。
那么,对于99升和11.2511.25升的容器,水的总量是 9/4 = 2.25的倍数
2.25在给定的选项中,只有 6.75=3×2.25是可能的。
我们可以用以下的动作顺序来测量。
装满9升的容器。
将99升的容器倒入11.25的容器。
再次填满9升的容器,然后
将9升的容器倒入11.25的容器中,直到后者被装满。这时,9升容器里还剩下6.75升,而另一个容器已经满了--把它倒出来,我们正好测出6.75升。
任务升级
包括6.75升,还有哪些可以准确秤量出的容量?
option = [1.5,3.25,5,6.75]
def pourMin(u,U): # u=small, U=larger
i,j,s = 2,1,True
ans = [float('INF')]
minvol = u*i - U*j
step = 0
while minvol <= u+U:#minvol <= 两个杯子容量之和
s = not(s)
minvol = abs(u*i - U*j)
i += s
j += not(s)
ans.append(minvol)
return sorted(set(ans))[:-2],[i for i in set(ans) if i in option]
u,U = 9,11.25
print(pourMin(u,U))
([0.0, 2.25, 4.5, 6.75, 9.0, 11.25, 13.5, 15.75, 18.0, 20.25],
[6.75])
共有 9 个不同的称量结果:
2.25, 4.5, 6.75, 9.0, 11.25, 13.5, 15.75, 18.0, 20.25
符合题目的是 6.75
网友评论