The aim of this textbook is to present an account of the theory of computation. After
introducing the concept of a model of computation and presenting various examples the author
explores the limitations of effective computation via basic recursion theory. Self-reference
and other methods are introduced as fundamental and basic tools for constructing and
manipulating algorithms. From there the book considers the complexity of computations and the
notion of a complexity measure is introduced. Finally the book culminates in considering time
and space measures and in classifying computable functions as being either feasible or not. The
author assumes only a basic familiarity with discrete mathematics and computing making this
textbook ideal for a graduate-level introductory course. It is based on many such courses
presented by the author and so numerous exercises are included. In addition the solutions to
most of these exercises are provided.