REFERENCE BOOKS

Note that in all these reference books, there are differences in the coverage and in the terminology and notation used.
For our purposes the lectures, the Cook notes and the Sipser text are the official sources.

For alternate sources I recommend an online overview paper by Neil Immerman,
Computability and Complexity, The Stanford Encyclopedia of Philosophy (Spring 2016 Edition), Edward N. Zalta (ed.)
and
a textbook by Herbert Enderton, "Computability Theory", Academic Press, 2011, all but Chapters 5 and 6.

Alternate introductions to the material of the first part of the course, in a different order, can be found in:
Boolos, Burgess and Jeffrey's book, "Computability and Logic", Fifth Edition, Cambridge University Press, Chapters 1-8.

and in Martin, "Introduction to Languages and Theory of Computation", Fourth Edition, McGraw-Hill, 2011, Chapter 7-11, especially 10 (but you could disregard the material about context-free languages).

Another thorough alternate to the material in the first part of the course is Chapter 2 of:
G. Tourlakis, "Theory of Computation", Wiley 2012.

Alternate coverage of the material in the last part of the course is in:
Chapter 34 of Cormen, Leiserson, Rivest and Stein, "Introduction to Algorithms", MIT press.

There are many other books that include an introduction to computability and recursive function theory plus NP-completeness. Two good ones are:

E. Rich, "Automata, Computability and Complexity", Pearson 2008, Chapters 18-22 and 25 for the first part and Chapters 27 and 28 for the second part.

Davis, Sigal and Weyucker, "Computability, Complexity and Languages", Morgan Kauffman, chapters 1-6, and 8.