Discrete mathematics is fundamental to computer science, and interesting, challenging problems in discrete mathematics arise in programming languages, computer architecture, networking, distributed systems, database systems, artificial intelligence, theoretical computer science, and elsewhere. This up-to-date text prepares undergraduates with four units of study: counting and listing, functions, decision trees and recursion, and basic concepts of graph theory. Each unit is divided into four sections, and each section contains a selection of problems that vary in difficulty. Solutions to these problems are given at the end of the text. Multiple-choice questions for review appear at the end of each unit. The text offers students the mathematical language and sophistication to recognize and articulate the ideas behind these questions and to answer questions similar in concept and difficulty. Those who master the necessary ideas and mathematical language to understand these review questions gain the ability to formulate, in the neutral language of mathematics, the problems that arise in various applications of computer science--a skill that enables them to discuss problems in discrete mathematics with other computer scientists and with mathematicians.