Functions allow programmers to organize and reuse code. They take in parameters and return values. Parameters act as variables that represent the information passed into a function. Arguments are the actual values passed into the function call. Functions can have default parameter values. Functions can return values using the return statement. Python passes arguments by reference, so changes made to parameters inside functions will persist outside the function as well. Functions can also take in arbitrary or keyword arguments. Recursion is when a function calls itself within its own definition. It breaks problems down into sub-problems until a base case is reached. The main types of recursion are direct, indirect, and tail recursion. Recursion can make code more elegant but uses more memory than iteration.