This book began as a series of lecture notes for a course called Introduc tion to Adaptive Systems which I developed for undergraduate Computing Science majors at the University of Alberta and first taught in 1973. The objective of the course has been threefold: (l) to expose undergraduate computer scientists to a variety of subjects in the theory and application of computation, subjects which are too often postponed to the graduate level or never taught at all; (2) to provide undergraduates with a background sufficient to make them effective participants in graduate level courses in Automata Theory, Biological Information Processing, and Artificial Intelligence; and (3) to present a personal viewpoint which unifies the apparently diverse aspects of the subject matter covered. All of these goals apply equally to this book, which is primarily designed for use in a one semester undergraduate computer science course. I assume the reader has a general knowledge of computers and programming, though not of particular machines or languages. His mathematical background should include basic concepts of number systems, set theory, elementary discrete probability, and logic.