A Recursive Introduction to the Theory of Computation by Carl Smith