Here's a similar function for Metapost that uses the built-in path bounding box features to find the maximum or minimum of each part of a function curve.
prologues := 3;
outputtemplate := "%j%c.eps";
vardef steps_over(expr p, k) = steps(p,k,true) enddef;
vardef steps_under(expr p, k) = steps(p,k,false) enddef;
vardef steps(expr p, k, over) =
save xmin, xmax, xstep, ss;
xmin = xpart point 0 of p;
xmax = xpart point infinity of p;
xstep = (xmax-xmin)/k;
path ss;
for x = xmin step xstep until xmax-eps:
hide(ss := p cutbefore (down--up) scaled infinity shifted (x,0)
cutafter (down--up) scaled infinity shifted (x+xstep,0);)
if x>xmin: & fi
(x,0) -- if over: ulcorner ss -- urcorner ss
else: llcorner ss -- lrcorner ss fi -- (x+xstep,0)
endfor
enddef;
beginfig(1);
u = 8mm;
% axes
path xx, yy;
xx = (-4.5u,0) -- (4.5u,0);
yy = (0,-u) -- (0,11u);
drawarrow xx withcolor .5 white; label.rt (btex $x$ etex, point 1 of xx);
drawarrow yy withcolor .5 white; label.top(btex $y$ etex, point 1 of yy);
% define graph path
vardef f(expr x) = 10-x**2 enddef;
-xmin = xmax = 3; s = 0.1;
path ff; ff = ((xmin,f(xmin)) for x=xmin+s step s until xmax+eps: -- (x,f(x)) endfor) scaled u;
% draw steps and graph
draw steps_over(ff,7) withcolor .67 red;
draw ff;
endfig;
end.
