A potential downside to this approach is that we have to work with a specific programming
language, possibly making it difficult to separate the idea of the algorithm
from the details of its implementation. Our implementations are designed to mitigate
this difficulty, by using programming constructs that are both found in many modern
languages and needed to adequately describe the algorithms.