Originariamente inviato da ramy89
codice:
#include <iostream>
using namespace std;
bool f(int nombre);
bool g(int nombre)
{
if(nombre == 0) return true;
else return f(nombre-1);
}
bool f(int nombre)
{
if(nombre == 1) return true;
else return g(nombre-1);
}
Il problema di queste due funzioni (mutualmente) ricorsive è che se gli passi un numero negativo la ricorsione non termina più.
g(-4) -> f(-5) -> g(-6) -> ...
In generale si, la g(nombre) ritorna 1 se il numero è pari, la f(nombre) ritorna 1 se il numero è dispari, ma se passi un numero dispari alla g(nombre) la ricorsione non termina più, così come se passi un numero pari alla f(nombre) non termina.
Se hai lo stack sufficientemente grande e passi ad esempio 2 alla f(nombre), può succedere che invece di andare in segmentation fault vai in underflow, e riparti da 2^32-1, che è dispari per cui ti ritorna true.
Io le modificherei così:
codice:
bool g(int nombre)
{
if(nombre == 0) return true;
else if(nombre==1) return !f(nombre);
else return f(nombre-1);
}
bool f(int nombre)
{
if(nombre == 1 ) return true;
else if(nombre==0) return !g(nombre);
else return g(nombre-1);
}
Così dovrebbe funzionare per tutti i numeri naturali compreso zero, ma non per i numeri negativi.
Prova a compilarlo.