Recursion is a programming concept where a function calls itself to solve complex problems by breaking them down into smaller ones. It can be categorized into direct and indirect recursion, and while it generally leads to shorter and simpler code, it is slower than iteration due to function call overhead and stack maintenance. Recursive functions consist of a base case, which prevents infinite recursion, and a recursive case, which involves calling the function again with modified parameters.