A tail call is a function call that is the last thing a function does before returning; its result becomes the caller’s result directly. Tail-call optimization (also called proper tail recursion) means that such a call reuses the current stack frame instead of allocating a new one. Because no frame accumulates, a chain of tail calls runs in constant stack space and cannot overflow the stack, no matter how many calls deep it goes.
Scheme is the canonical example of a language that requires this behavior. The Scheme report states that “Implementations of Scheme are required to be properly tail-recursive,” and that an implementation is properly tail-recursive if it “supports an unbounded number of active tail calls.” A call is active if the called procedure might still return.
The report explains why no space is needed: “Intuitively, no space is needed for an active tail call because the continuation that is used in the tail call has the same semantics as the continuation passed to the procedure containing the call.” Because the caller has nothing left to do after the call, there is nothing to remember, so the frame can be discarded.
This requirement has a practical consequence: a programmer can write iteration as ordinary recursion and rely on it running in constant space, so dedicated looping constructs become, in the report’s words, “useful only as syntactic sugar.” Tail-call optimization is what lets functional languages favor recursion over mutable loops without paying a cost in stack growth.