c++ - recursiva - sintaxis de recursividad
Función recursiva para verificar dígitos (4)
El código válido será
size_t fun( int n )
{
const int base = 10;
int digit = n % base;
n /= base;
return ( n == 0 ?
0 :
( digit && n % base && !( n % base % digit ) ) + fun( n ) );
}
Escribe una función recursiva para verificar cuántos dígitos del número se pueden dividir por el dígito que está detrás de ellos. Ejemplo: 84963
debería devolver 2, porque 8 se puede dividir por 4 y 6 se puede dividir por 3. Mi función no parece producir nada en absoluto.
#include <iostream>
using namespace std;
int fun (int n);
int main()
{
int n;
cin >> n;
cout << fun(n) << endl;
return 0;
}
int fun(int n){
int count = 0;
if (fun(n % 100) % fun(n % 10) == 0)
count++;
return count;
}
En realidad, no está actualizando el valor n
para entrar en un ciclo infinito; por el contrario, su función, inicialmente, solo está diseñada para números de 3 dígitos. Creo que debería ser algo similar a:
int fun(int n, int ant, int count){
if( n == 0 )
return count;
if (ant != 0 &&
(n%10) % ant == 0)
count++;
return fun(n/10, n%10, count);
}
Debería trabajar con diferentes números de dígitos.
Su recursión no tiene mucho sentido en este momento. Un enfoque más lógico para esto sería ver si el último número (por lo tanto, 1
en 321
), actualmente puede dividir el segundo último número (por lo que 2
en 321
). Puedes hacer esto definiendo una función que verifique si eso es posible, y pasa recursivamente el número dividido por 10. Esa función se vería así:
int fun(int n)
{
if (n < 10)
return 0;
int last = n % 10;
n = n / 10;
int secondlast = n % 10;
if (secondlast != 0 && last != 0 && secondlast % last == 0)
return 1 + fun(n);
else
return fun(n);
}
Nota de actualización: Después de observar a Vlad por el comentario de Moscú, moví la last != 0
parte de la condición hacia adelante, para resolver un error (dividir entre 0).
El problema del que hablaba Vlad de Moscú es el siguiente: si quieres, por ejemplo, que la parte 04
cuente como 0, debes usar el código como se muestra arriba. De lo contrario, debe eliminar la secondlast != 0
.
int countIfDiv(int num) {
int pair = num % 100;
int first = pair / 10;
if (first == 0) return 0;
int second = pair % 10;
int next = num / 10;
return first % second == 0 ? 1 + countIfDiv(next) : 0 + countIfDiv(next);
}
Solo tira un par, prueba la división, luego corta el último número y repite.