295: Discrete Structures¶
Foundations of mathematical reasoning for computer science.
Topics¶
Boolean algebra and logic gates
Combinatorics and counting principles
Graph theory
Inductive and deductive proofs
Recurrence relations
Finite state machines (FSMs)
Projects¶
Finite-State Automaton (295/fsa.c)¶
Implements a three-state FSA that accepts a stream of binary integers and transitions between states according to a fixed transition table, demonstrating the connection between formal automata theory and executable code.
int state = 0;
int input = 0;
while (input != -1) {
scanf("%d", &input);
if (state == 0) {
state = (input == 0) ? 1 : 0;
} else if (state == 1) {
state = (input == 0) ? 2 : 0;
} else if (state == 2) {
state = (input == 0) ? 2 : 0;
}
printf("state = %d\n", state);
}
Tower of Hanoi (295/hanoi.c)¶
Generates the move sequence for the Tower of Hanoi problem, illustrating recursive problem decomposition and exponential time complexity.
/* M(k) = 2·M(k-1) + 1 minimum moves for k discs */
int m[64];
for (k = 1; k < 64; k++)
m[k] = 2 * m[k - 1] + 1;
for (i = 0; i < 64; i++)
printf("m[%d]=%d\n", i, m[i]);
Factorial (295/factorial.c)¶
Recursive implementation of the factorial function — a canonical example of inductive definition and base-case reasoning.
int Factorial(int n) {
if (n <= 1)
return 1;
return n * Factorial(n - 1);
}
Compound Interest (295/compound.c)¶
Recursively computes compound interest at 5.5% annual growth, demonstrating recurrence relations applied to a real-world financial formula.
float amount(int t) {
if (t == 0)
return 1000.0; /* principal */
return amount(t - 1) * 1.055; /* 5.5% annual growth */
}
Sorting Algorithm Comparison (295/improved_bubble.c, 295/sort.c, 295/time.c)¶
Three programs exploring optimized bubble sort: improved_bubble.c implements early-termination
bubble sort, sort.c compares it against the naive version on large arrays, and time.c
measures wall-clock execution time using ftime.
void improvedbubble(int a[], int n) {
int pass = 1, sorted = 0, temp;
while (!sorted) {
sorted = 1;
for (int i = 0; i < n - pass; i++)
if (a[i] > a[i + 1]) {
temp = a[i]; a[i] = a[i+1]; a[i+1] = temp;
sorted = 0;
}
pass++;
}
}