В теории вычислимости рекурсия хода значений — это метод определения функций теории чисел с помощью рекурсии . При определении функции f с помощью рекурсии хода значений значение f ( n ) вычисляется из последовательности .
Тот факт, что такие определения могут быть преобразованы в определения с использованием более простой формы рекурсии, часто используется для доказательства того, что функции, определенные рекурсией хода значений, являются примитивно рекурсивными . В отличие от рекурсии хода значений, в примитивной рекурсии вычисление значения функции требует только предыдущего значения; например, для 1-арной примитивно рекурсивной функции g значение g ( n +1) вычисляется только из g ( n ) и n .
Факториальная функция n ! рекурсивно определяется правилами
Эта рекурсия является примитивной рекурсией , поскольку она вычисляет следующее значение ( n +1)! функции на основе значения n и предыдущего значения n ! функции. С другой стороны, функция Fib( n ), которая возвращает n- е число Фибоначчи , определяется с помощью уравнений рекурсии
Для вычисления Fib( n +2) требуются последние два значения функции Fib. Наконец, рассмотрим функцию g, определенную с помощью уравнений рекурсии
Для вычисления g ( n +1) с использованием этих уравнений необходимо вычислить все предыдущие значения g ; в общем случае для вычисления g не достаточно фиксированного конечного числа предыдущих значений . Функции Fib и g являются примерами функций, определяемых рекурсией хода значений.
В общем случае функция f определяется рекурсией хода значений , если существует фиксированная примитивная рекурсивная функция h такая, что для всех n ,
где - число Гёделя, кодирующее указанную последовательность. В частности
предоставляет начальное значение рекурсии. Функция h может проверить свой первый аргумент, чтобы предоставить явные начальные значения, например, для Fib можно использовать функцию, определенную как
где s [ i ] обозначает извлечение элемента i из закодированной последовательности s ; легко увидеть, что это примитивная рекурсивная функция (при условии использования соответствующей нумерации Гёделя).
Для того чтобы преобразовать определение рекурсией хода значений в примитивную рекурсию, используется вспомогательная (вспомогательная) функция. Предположим, что требуется иметь
Чтобы определить f с помощью примитивной рекурсии, сначала определите вспомогательную функцию хода значений , которая должна удовлетворять
где правая часть берется как нумерация Гёделя для последовательностей .
Таким образом кодирует первые n значений f . Функция может быть определена примитивной рекурсией, поскольку получается путем добавления к новому элементу :
где append ( n , s , x ) вычисляет, всякий раз, когда s кодирует последовательность длины n , новую последовательность t длины n + 1 такую, что t [ n ] = x и t [ i ] = s [ i ] для всех i < n . Это примитивно-рекурсивная функция, при условии соответствующей нумерации Гёделя; h изначально предполагается примитивно-рекурсивной. Таким образом, отношение рекурсии можно записать как примитивную рекурсию:
где g сама по себе примитивно рекурсивна, представляя собой композицию двух таких функций:
Учитывая , что исходная функция f может быть определена как , что показывает, что она также является примитивной рекурсивной функцией.
В контексте примитивных рекурсивных функций удобно иметь средство для представления конечных последовательностей натуральных чисел как отдельных натуральных чисел. Один из таких методов, кодирование Гёделя , представляет последовательность положительных целых чисел как
где p i представляет i -е простое число. Можно показать, что при таком представлении все обычные операции над последовательностями являются примитивно рекурсивными. Эти операции включают
Используя это представление последовательностей, можно увидеть, что если h ( m ) является примитивно рекурсивной, то функция
также является примитивно рекурсивным.
Когда последовательность может включать нули, она представляется как
что позволяет различать коды последовательностей и .
Не каждое рекурсивное определение может быть преобразовано в примитивно-рекурсивное определение. Одним из известных примеров является функция Аккермана , которая имеет вид A ( m , n ) и, как доказуемо, не является примитивно-рекурсивной.
Действительно, каждое новое значение A ( m +1, n ) зависит от последовательности ранее определенных значений A ( i , j ), но i -s и j -s, для которых значения должны быть включены в эту последовательность, сами зависят от ранее вычисленных значений функции; а именно ( i , j ) = ( m , A ( m +1, n )). Таким образом, невозможно закодировать ранее вычисленную последовательность значений примитивно-рекурсивным способом, как предложено выше (или вообще, как выясняется, эта функция не является примитивно-рекурсивной).