Número de veces que el número aparece en una matriz

Encontré un ejercicio en un libro de C ++ que dice “Escribe una función que contará la cantidad de veces que aparece un número en una matriz”. Todo está bien, el progtwig está funcionando. Pero el ejercicio también dice que la función debe ser recursiva.

¿Cómo puedo hacer que una función recursiva funcione así?

#include  int count(int number, int array[], int length) { int counter = 0; for(int i = 0; i < length; i++) if(array[i] == number) counter++; return counter; } int main() { int numbers[10] = {3,4,1,2,4,5,6,5,4,5}; int number_to_search = 5; std::cout << number_to_search << " appears " << count(number_to_search, numbers, 10) << " times in the array."; return 0; } 

En lugar del bucle y el contador que tiene ahora, devuelva 0 + recursive_step o 1 + recursive_step , donde recursive_step es una llamada a count(...) donde ha aumentado el puntero de la matriz y la length disminuida. Su caso base es cuando la length == 0 , momento en el que acaba de devolver 0 .

Una buena forma de entender la recursión es estudiar cómo se realiza el cálculo, paso a paso. En tu ejemplo harás algo como esto:

 count(5, {3,4,1,2,4,5,6,5,4,5}) 0+count(5, {4,1,2,4,5,6,5,4,5}) 0+0+count(5, {1,2,4,5,6,5,4,5}) 0+0+0+count(5, {2,4,5,6,5,4,5}) 0+0+0+0+count(5, {4,5,6,5,4,5}) 0+0+0+0+0+count(5, {5,6,5,4,5}) 0+0+0+0+0+1+count(5, {6,5,4,5}) 0+0+0+0+0+1+0+count(5, {5,4,5}) 0+0+0+0+0+1+0+1+count(5, {4,5}) 0+0+0+0+0+1+0+1+0+count(5, {5}) 0+0+0+0+0+1+0+1+0+1+count(5,{}) 0+0+0+0+0+1+0+1+0+1+0 <---The last 0 is the base case 3 

Si se le permite cambiar la especificación de la función, también puede hacer algo genial llamado recursión de la cola . En lugar de return 1 + count(...) , agregue el número acumulado hasta un parámetro para contar: int count(int number, int array[], int length, int acc)

Y return count(..., acc+1) o el return count(..., acc+0) . Algunos comstackdores pueden realizar la optimización de la llamada de cola , transformándola en un bucle en el código comstackdo. Esto ahorra memoria en comparación con una recursión regular.

Utilice esta función de count :

 int count(int number, int array[], int length) { if (length == 0) return 0; return (number == *array) + count(number, array+1, length-1); } 

¿Qué hay de tratar de esta manera: –

 int count(int num, int* arr, int length) { if (!length) return 0; int c = count(num, arr+1, length-1); return arr[0] == num? c + 1: c; } int main(void) { int arr[10] = {3,4,1,2,4,5,6,5,4,5}; std::cout << count(2, arr, 10); return 0; } 

Esto es lo que haces (no te mostraría ningún código para evitar estropearte un ejercicio).

Primero, recuerde que para ser recursivo, su función necesita llamarse a sí misma. A continuación, considere estos dos puntos:

  • Cuando el parámetro de length es igual a cero, el valor de retorno de count(...) debe ser cero
  • Cuando el parámetro length no sea cero, considere el valor de retorno de count(...) para array + 1 y length-1 ; llamémoslo prior . El valor de retorno del count(...) actual count(...) será igual a prior+1 si la array[0] es igual al number , o prior cuando la array[0] no sea igual al number .

Cuando haga su código con esta descripción, observe cómo tiene un if al comienzo de su función recursiva. Esto if divide su código en el caso base ( length == 0 ) y el paso recursivo (calcular el resultado en base a una llamada recursiva). Esta es una estructura común de funciones recursivas: tendrá que reproducir esta estructura cada vez que escriba un código recursivo.

 #include  void count(int number, int array[], int length, int &occurence) { if (*array == number) ++occurence; if (length == 1) return; else count(number, array+1, length-1, occurence); } int main() { int numbers[10] = {3,4,1,2,4,5,6,5,4,5}; int number_to_search = 5; int occurence = 0; count(number_to_search, numbers, 10,occurence); std::cout << number_to_search << " appears " << occurence << " times in the array."; } 
  #include  #include  #include  using namespace std; int i, j,n,c=0, k=0; int a[1000], b[1000]; class Array { public: void input () { cout<<"Enter how many values: "; cin>>n; } void arraySeries () { cout<<"Array elements: "; srand(time(0)); for (i=0; i