Tengo que hacer una función recursiva en c, para saber si un vector de tamaño n es un monte (siempre n siendo par)
Un vector es un monte, si hasta la mitad es creciente, y la otra mitad es decreciente.
Lo pense dividiendo la lista en la mitad(M). Y recorrerla hasta M , preguntando si el elemento i <i+1 , entonces quedaria la recursion como monte(A[] ,i+1,m).
Y la otra mitad , recorrerla dese tamaño hasta M,monte(A[],tam-1,m) , ya que usaria la misma pregunta logica tam<tam-1 . Pero ahi surge el problema, por la lista de la izquierda pregunto con i+1 y aca con tam-1 . Alguna ayudita? Gracias.
Cita de: pacman22 en 31 Octubre 2014, 04:12 AM
.....................................................
Lo pense dividiendo la lista en la mitad(M). Y recorrerla hasta M , preguntando si el elemento i <i+1 , entonces quedaria la recursion como monte(A[] ,i+1,m).
.....................................................
Creo que es liarla eso de dividir el array en dos partes.
Yo invocaría a la función recursiva con algo como:
printf( "\n\t%s.\n\n" , Monte ( num , i , sizeof num / sizeof *num - 1 ) == 1 ? "SI es Monte" : "NO es Monte" ) ;
Y montaría la función recursiva para que diferencie entre la mitad izquierda y la derecha:
EI: codigo borrado, no hagas tareas.
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Cita de: pacman22 en 31 Octubre 2014, 04:12 AMTengo que hacer una función recursiva en c, para saber si un vector de tamaño n es un monte (siempre n siendo par)
Un vector es un monte, si hasta la mitad es creciente, y la otra mitad es decreciente.
Como ya te comento
leosansan la solución es mas sencilla.
Ya que tienes una lista "a" con un numero par de elementos si utilizamos "i" y "j" como indices para la parte izquierda y derecha (con valores iniciales primero y ultimo respectivamente) la condición limite (todos los elementos procesados formando un monte) es "i + 1 == j".
Si esa condición no se da ello indica que faltan elementos por procesar y lo primero que se debe hacer es verificar que sean mayores:
1) El elemento siguiente de la parte izquierda: "a[ i ] < a[i + 1]".
2) El elemento anterior de la parte derecha: "a[j - 1] > a[ j ]".
Si eso se da hasta el momento tienes un monte, la palabra final la tiene el proceso recursivo (la llamada a función) de los elementos "i + 1" y "j - 1".
Tal vez suene complicado pero no lo es, la función termina como una sola sentencia con tres operadores y cuatro operandos, inténtalo tu solo, presenta los avances y te ayudamos con los problemas que resulten.
Un saludo
Cita de: rir3760 en 31 Octubre 2014, 17:08 PM
la condición limite (todos los elementos procesados formando un monte) es "i + 1 == j".
....................................................
"Creo", si no me fallan las cuentas, que con la opción de "ó : i + 2 == j " cubrirías el caso de un numero impar de elementos.
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Que tal esto?
void monte(int a[],int i,int fin)
{
if (i!=(fin/2))
if ((a[i+1]>a[i])&&(a[(fin/2)+i+1]<a[(fin/2)+i]))
monte(a,i+1,fin);
else
printf("\n el vector no es monte ");
else
printf("\n el vector es monte ");
}