Esto no es una respuesta exacta, pero ayuda a determinar rápidamente en muchos de los casos que una función dada es primitiva recursiva. La idea es usar un razonable lenguaje de programación en el que su función puede ser expresada más fácilmente que con la "cruda" de la aritmética y primitivo de la recursividad. Por supuesto, el lenguaje de programación debe ser limitado suficiente para evitar ilimitado de búsquedas y otras construcciones que llevan a general de la recursividad. Voy a mencionar sólo un fácil posibilidad.
Supongamos que una función de $f : \mathbb{N} \to \mathbb{N}$ es calculada por un simple imperativo programa en el polinomio tiempo de ejecución (en realidad, como Grigory señala en su respuesta, cualquier primitiva recursiva enlazado va a hacer). Más precisamente, el programa está permitido el uso de operaciones básicas de la aritmética, valores booleanos, variables, matrices, bucles y sentencias condicionales. A continuación, la función de $f$ es primitiva recursiva.
La razón por la que un programa de este tipo sólo se puede definir una función recursiva primitiva es que la totalidad de la ejecución del programa puede ser codificada por un número $N$ cuyo tamaño de bits es acotado por un polinomio $p(n)$ donde $n$ es la entrada. Debido a que la verificación de que un número codifica la ejecución de un simple imperativo programa es primitiva recursiva, se puede realizar una búsqueda delimitada a a $2^{p(n)}$ encontrar el número de $N$ (un almacén de búsqueda es primitiva recursiva) y extracto de la respuesta de ella.
Apliquemos esto a su pregunta. El siguiente programa en Python se calcula la función de $\pi(n)$ y utiliza sólo un par de bucles y aritmética básica (podríamos sustituir la función del resto % con otro bucle). Su tiempo de funcionamiento es de segundo grado en $n$, suponiendo que todas las operaciones básicas que son constantes en el tiempo:
def pi(n):
'''Computes the number of primes which are less than or equal n.'''
p = 0 # the number of primes found
k = 2 # for each k we test whether it is prime
while k <= n:
j = 1 # possible divisors of k
d = 0 # number of divisors of k found
while j <= n:
if k % j == 0: d = d + 1
j = j + 1
if d == 2: p = p + 1
k = k + 1
return p
Por lo tanto, su función es primitiva recursiva.