The mu-recursive (partial recursive) functions extend the primitive recursive functions by adding the unbounded minimization (mu) operator, which searches for the smallest input satisfying a condition. This single addition is enough to capture all Turing-computable functions, but at the cost of totality — mu-recursive functions may be partial, undefined on some inputs when the search never terminates. The equivalence between mu-recursive functions and Turing machines is one of the key pillars supporting the Church-Turing thesis.
Start with familiar primitive recursive functions (addition, multiplication), then define a function that requires unbounded search — such as finding the smallest divisor of a number greater than 1. Formalize this using the mu operator, then construct a mu-recursive function that is genuinely partial (undefined on some inputs) to see why totality is lost.
Recall from your study of primitive recursive functions that the entire class is built from zero, successor, and projection using only composition and primitive recursion (bounded loops). Every primitive recursive function is total — it terminates on every input. The Ackermann function demonstrated that totality has a cost: some computable functions simply cannot be written with bounded recursion alone, because the number of iterations needed cannot be predetermined by a simpler function. This gap motivates a new operation.
The mu operator (unbounded minimization) fills that gap. Given a total function f(x, y), define μy[f(x, y) = 0] to be the smallest natural number y such that f(x, y) = 0, searching y = 0, 1, 2, … in order. If such a y exists, that's the result. If no such y exists, the computation runs forever and the function is undefined at x — not an error code, not zero, but genuinely undefined. A function computable by the mu operator applied to primitive recursive functions (or recursively to already-built mu-recursive functions) is called a partial recursive function or mu-recursive function. The class of mu-recursive functions is exactly the class of Turing-computable partial functions.
To see why mu is necessary, consider: can you write a primitive recursive function that, given n, finds the smallest prime p greater than n? The answer is yes — primality testing is primitive recursive and you can bound the search (by Bertrand's postulate, p < 2n always works). But can you write one that, given a Diophantine equation, finds the smallest solution? Not in general — the number of steps needed may depend on the equation in a way no simpler function can anticipate. The mu operator says: "search indefinitely, and stop when you find what you need." This indefinite search is precisely what primitive recursion forbids and what Turing machines naturally allow.
The conceptual price of adding mu is partiality: mu-recursive functions may be undefined on some inputs. This is not a limitation of the formalism — it mirrors a genuine computational reality. A Turing machine may not halt. A program may loop. The class of *total* functions computable by some Turing machine is not itself computably enumerable; you cannot list all total computable functions with a uniform algorithm. By including partial functions, the mu-recursive framework achieves a clean equivalence: a function is mu-recursive if and only if it is computable by a Turing machine, if and only if it is λ-definable in the lambda calculus. This triple equivalence is the heart of the Church-Turing thesis and marks the mu operator as the key ingredient that lifts bounded recursion to full computability.