Functions and recursion are programming concepts. A function is a block of code that performs a specific task. Functions have a prototype, call, and body. Recursion is a technique where a function calls itself to solve a problem. It breaks the problem into smaller subproblems until it reaches a base case. Recursion uses the call stack to remember the state each time the function calls itself. Tail recursion is when the recursive call is the last thing executed, while head recursion calls itself first.