Desarrollo
Menú
Gamersmafia es ahora un archivo de solo lectura.

¿Alguien me explica por qué no se ejecuta la sentencia marcada con un 2, si se ejecuta la 1?

Buenas, estoy escribiendo una función recursiva en c++ que devuelve cierto en caso de encontrar una componente en un vector de enteros positivos "v" , que sea igual al índice de esa componente (ya he contemplado la particularidad de C y C++ de empezar sus índices desde 0 en adelante).

 

El caso es que este código he de compilarlo y ejecutarlo en un servidor de la universidad. Cual es mi sorpresa cuando en mi casa, compilando en visual studio y ejecutando desde ahí, la función se comporta como debe, pero al ejecutarlo en el servidor de la escuela:

Entra en este if y me muestra por pantalla el texto "Se cumple" pero me devuelve false en vez de true, ni idea de por qué, si la sentencia de devolver verdadero se encuentra justo debajo de la que muestra "Se cumple" por pantalla...

 

    if (v[(i-1)]== i)
                    {
                    cout << "Se cumple" << endl;
                    return true;
                    }

 

Estoy bastante desconcertado ya que no entiendo el por qué de esta situación, no llevo mucho programando pero no sé por qué me da que esto es raro raro, llevo ya unos cuantos días revisando el código y por eso ahora acudo a vosotros, ya que yo solo no soy capaz.

Aquí la función al completo:

#include <iostream>
using namespace std;

bool coincidencia(int v[], int i);

bool coincidencia(int v[], int i)
{
    if (0<i)
    {
            cout << "i:" << i << endl;
            cout << "V["<< i-1 << "]: " << v[i-1] << endl;

        if (i == 1)
        {
            if (v[(i-1)]==1)
               
               
                {
                cout << "estoy comparando " << v[i-1] << " con " << 1 << endl;
                return true;
                }

            else
               
                return false;
               

        }
        else
            {
                cout << "Comparo " << v[i-1] << " con " << i << endl;
                if (v[(i-1)]== i)
                    {
                    cout << "Se cumple" << endl;
                    return true;
                    }
                else
                    coincidencia(v,i-1);
            }
    }
    else
     return false;

}



int main()
{
    int tam;
    int *v;
    char b;

    cout << "Introduce el tamaño de vector: ";
    cin >> tam;
    cout << endl;
    v = new int[tam];

    for(int k=0;k<tam;k++)
    {
        cout << "Introduce la componente " << k+1 <<" del vector: ";
        cin >> v[k];
        cout << "k: " << k << endl;
        cout << "uve: " << v[k] << endl << endl;

    }
   
    for(int k=0;k<tam;k++)
        {cout << v[k] << " " << endl << endl << endl;}


    if(coincidencia(v,tam))
        cout << "Cierto" << endl;
    else
        cout << "Falso" << endl;
       
       

        return 0;
}

 

 

Un saludo y gracias

Recompensa: 100
Pregunta cancelada
Esta pregunta ha sido cancelada o ha sido resuelta.

Bien, con las prisas se me olvidó marcar las sentencias.

1) corresponde al cout con “Se cumple”

y 2) corresponde al return true que hay justo debajo.

Incluyo el main y además los comentarios que tengo puestos a modo de depuración para saber lo que va haciendo en cada momento el programa, ya que he de compilar en el servidor que os he dicho y no puedo depurar ni ejecutar paso por paso las instrucciones como podría en visual o dev

Otra aclaración:

La función coincidencia se divide en dos casos, el caso trivial, reprsentado por un vector de longitud 1, y el caso no trivial, con un vector de longitud i > 1.

La llamada recursiva se efectua reduciendo una componente al vector que estoy revisando. Esta longitud se representa con “i” y como digo, a cada llamada decrece en una unidad, desde la longitud total del vector hasta 1, ya que no contemplo la posibilidad de que haya vectores vacíos.

Creí que sería necesario dar algunas explicaciones del diseño de la función porque viéndola así de repente lia bastante

Toda ayuda es bienvenida, gracias de antemano

Solucionado, me había comido el return delante de la llamada recursiva , tantas horas obcecado con eso que al final ya no veía nada, gracias igualmente

Tu te lo comes tu te lo quisas, cierra la pregunta y listo

Top sabios
ObiJu 186
Draco351 110
Mave 105
Alim_Jah 97
ReNeGaDo 72
2_Face 60
Casti 60
AlbeR. 57
Anferne 50
Samu. 49
Un punto = una mejor respuesta