An efficient algorithm that solves one computational problem by making calls to a subroutine (oracle) that solves another problem.