Ver si un vector es un monte

Iniciado por pacman22, 31 Octubre 2014, 04:12 AM

0 Miembros y 1 Visitante están viendo este tema.

pacman22

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.


leosansan

#1
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:

Código (cpp) [Seleccionar]
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.





rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

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! ..... !!!!




pacman22

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 ");
}