es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dado un array, devuelve verdadero si puedes dividirlo en dos grupos iguales de forma recursiva.

Nombre del método:

public static boolean equalSplit (int[] a)

Si puedes dividir un array en dos y la suma de los valores es igual, devuelve true, ejemplo:

{-3,5,12,14,-9,13} // devuelve true -3+5+14 = 12+(-9)+13
{-3,5,-12,14,-9,13}; // devuelve false, puedes dividirlo en dos grupos pero los grupos no serán iguales 3+5+14+(-12)=-9+13
{-3,5,12,14,-9}; // devuelve false porque no se puede dividir el array en dos

No se permite cambiar el orden del array, solo se permite la recursión, se permiten métodos privados siempre y cuando también sean recursivos.

Lo que has escrito (código no completo):

public class Rec
{
    // método privado para encontrar la suma total de un array.
    static int findSum(int A[], int N)
    {
        if (N <= 0)
            return 0;
        return (findSum(A, N - 1) + A[N - 1]);
    }    

    //
    public static boolean equalSplit (int[] a)
    {
        return(equalSplit(a,0,0));   
    }

    // recurso
    private static boolean equalSplit (int[] a,int sum,int i) 
    {
        int totalSum = findSum(a,a.length); // suma total del array dado.
        if(i > a.length) // se ejecuta hasta llegar al final del array.
            return false;
        if(totalSum - sum == sum) // si se resta la suma recursiva de la suma total y da un número igual, devuelve true
            return true;

        int take = equalSplit(a,sum + a[i] , i+1); // boolean no se puede convertir en int
    }    
}

Lo que estoy intentando hacer:
He utilizado un método privado para encontrar la suma de todo el array y restarla de la suma total. La suma en el método principal que debe sumar el array paso a paso. Mi problema es que el método es boolean y no tengo ni idea de cómo usar un método booleano de forma recursiva para completarlo.

Mis preguntas:
¿Puedes decirme si la estructura es correcta? y ¿cómo debería abordarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Tu estructura general de usar un método privado que encuentra la suma total del array y un método público que utiliza recursión para calcular la suma en pasos es un buen punto de partida.

    Para manejar el valor booleano de retorno, puedes intentar asignar el valor devuelto por la llamada recursiva a una variable y devolver esa variable al final del método. Algo como esto:

    private static boolean equalSplit (int[] a, int sum, int i) {
        int totalSum = findSum(a, a.length);
        if (i >= a.length) {
            return false;
        }
        if (totalSum - sum == sum) {
            return true;
        }
        boolean take = equalSplit(a, sum + a[i], i + 1);
        boolean notTake = equalSplit(a, sum, i + 1);
        return take || notTake;
    }
    

    Aquí, llama recursivamente al método dos veces: una vez tomando el elemento actual y otra vez sin tomarlo. Asignas los valores a dos variables booleanas separadas (take y notTake) y devuelves el resultado de su operación OR al final.

    Recuerda manejar también los casos base: cuando el array tiene longitud 0 o 1, el método debería devolver false.

Comments are closed.