Clarity vs. code reuse/generality
wwwayne
a0046088 at airmail.net
Sun Jul 5 14:20:26 EDT 2009
On Fri, 03 Jul 2009 14:34:58 GMT, Alan G Isaac <alan.isaac at gmail.com>
wrote:
>On 7/3/2009 10:05 AM kj apparently wrote:
=== 8< ===
>2.
>from scipy.optimize import bisect
>def _binary_search(lo, hi, func, target, epsilon):
> def f(x): return func(x) - target
> return bisect(f, lo, high, xtol=epsilon)
>
>3. If you don't want to use SciPy (why?), have them
>implement http://en.wikipedia.org/wiki/Bisection_method#Pseudo-code
>to produce their own `bisect` function.
Of course this isn't really pseudo-code, it's VB code with quite poor
comments:
'Bisection Method
'Start loop
Do While (abs(right - left) > 2*epsilon)
'Calculate midpoint of domain
midpoint = (right + left) / 2
'Find f(midpoint)
If ((f(left) * f(midpoint)) > 0) Then
'Throw away left half
left = midpoint
Else
'Throw away right half
right = midpoint
End If
Loop
Return (right + left) / 2
and even just throwing away the VB code and leaving the comments does
not give a good algorithm:
'Bisection Method
'Start loop
'Calculate midpoint of domain
'Find f(midpoint)
'Throw away left half
'Throw away right half
A much better approach to teaching introductory programming in any
language at almost any level is to incorporate some "top down problem
solving", including writing a method of solution (algorithm) in some
reasonably well-defined pseudo-code that can be easily elaborated and
translated into one's target language (and, peferably, some
reasonable-sized subset of related languages). This pseudo-code should
then become comments (or equivalent) for the students to convert to
real code, as in:
Algorithm bisect (f, left, right, epsilon):
# Bisection Method to find a root of a real continuous function f(x):
# Assume f(x) changes sign between f(left) and f(right) and
# we want a value not further than epsilon from a real root.
# Begin with the domain left...right.
# While the absolute value of (left - right) exceeds 2*epsilon:
# Calculate the midpoint, mid, of the domain.
# If the product of f(left) and f(mid) is positive:
# Set left to mid;
# Otherwise:
# Set right to mid.
# Return the midpoint of left...right.
===
And adapting this approach to kj's case is straightforward.
Of course, what consitutes a suitable vocabulary and syntax for an
algorithm pseudo-code language depends upon the target language(s),
the tastes of the instructor, and the point in the lesson or course.
My choice is for python+COBOL (as above) initially, soon incorporating
the usual arithmetic and relational operators (and how soon and how
many at once depends upon the level of the students: for an
introductory university/college course in Computer Science or
equivalent, where everyone should have a reasonable background in
mathemtics notation as a prerequisite, this should be very soon and
quite fast), arrays and subscripting, etc.
But if we were to write this algorithm or kj's in python-like
pseudo-code it would already *be* python codeor very close to
it--which is why we should teach intorductory programming in python.
Very soon students would be writing algorithms that required very
little elaboration to be programs.
But without including suitable problem solving and psudo-code
algorithm writing there will soon come a time or an example where
students are trying to think in code instead of in their natural
language and don't have the experience and repertoire to be able to do
that well.
I hope that's not too pedantic or AR?
wayne
>hth,
>Alan Isaac
More information about the Python-list
mailing list