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.

¿Cómo implementar una función recursiva para guardar los elementos del producto cartesiano N-ésimo de (0,1,…,N) en C ++?

Si la pregunta no está clara, quiero tener, por ejemplo, si N=4, un resultado como este:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . . . .
0 0 0 0 0 1 1 1 1 1 2 2 2 2 3 3 3 3 . . . .
0 1 2 3 4 0 1 2 3 4 1 2 3 4 1 2 3 4 . . . .

Esta es mi función:

int Combinazioni(int i, int N, vector<>> & combs){ 
if(i

donde combs es un vector de vectores que he inicializado con N filas, y luego lo transpondré para una mejor accesibilidad…

Cuando lo compilo me da esto:
advertencia: el control alcanza el final de una función que no devuelve nada [-Wreturn-type]
y cuando lo ejecuto imprime:

0
0 0
0 0 0
0 0 0 0

Definitivamente debe haber algún error en la lógica de mi recursión, pero no soy muy bueno visualizándolo, así que si hay una manera fácil y elegante de hacer esto o de resolver el error, estaría agradecido, gracias.

P.D. Creo que no es realmente necesario que sea súper eficiente, y de hecho, si hay una mejor alternativa a la recursión o alguna biblioteca efectiva, también sería bueno para mi propósito.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La función Combinazioni parece tener un par de errores lógicos:

    1. El bucle for que agrega elementos al vector interno combs[i] debería venir antes de la declaración de retorno para que recorra todos los valores posibles antes de retornar.
    2. El segundo bucle for también debería venir antes de la declaración de retorno, ya que tiene la intención de llenar los vectores internos con el mismo número de elementos.

    Aquí hay una versión modificada de la función que debería funcionar:

    void Combinazioni(int i, int N, vector<><int>> &combs){
        if(i==N) return; //caso base
        Combinazioni(i+1, N, combs); //llamada recursiva
        vector<int> temp;
        for (int k=0; k<n; k++){="" temp.push_back(k);="" combs.push_back(temp);="" agregar="" nueva="" fila="" a="" combs="" temp.pop_back();="" eliminar="" k="" de="" temp="" }="" transponiendo="" combs="" para="" un="" acceso="" más="" fácil=""></n;><><int>> transposed(N);
        for (int j=0; j<n; j++){="" for="" (int="" k="0;"></n;><combs.size(); k++){="" transposed[j].push_back(combs[k][j]);="" }="" }="" combs="transposed;" llenando="" todos="" los="" vectores="" internos="" con="" el="" mismo="" número="" de="" elementos="" int="" max_size="combs[N-1].size();" for(int="" j="0;"></combs.size();><n-1;j++){></n-1;j++){><max_size){ combs[j].push_back(combs[j].back());="" }="" }="" }="" ```="" aquí="" tienes="" cómo="" puedes="" llamar="" a="" la="" función="" para="" obtener="" la="" salida="" deseada:="" ```="" int="" n="4;"></max_size){><><int>> combs;
    Combinazioni(0, N, combs);
    for (int i=0; i<n; i++){="" for="" (int="" j="0;"></n;><combs[i].size(); j++){
            cout << combs[i][j] << " ";
        }
        cout << endl;
    }
    

    esto debería imprimir:

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
    0 0 0 0 0 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 ...
    0 1 2 3 4 0 1 2 3 4 1 2 3 4 1 2 3 4 3 4 ...
    

    ¡espero que esto ayude! j++){=”” cout=”” <<=”” combs[i][j]=”” <<=”” “;=”” }=”” cout=”” <<=”” endl;=”” }=”” ="" esto="" debería="" imprimir:=""=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” …=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” 0=”” …=”” 0=”” 0=”” 0=”” 0=”” 0=”” 1=”” 1=”” 1=”” 1=”” 1=”” 2=”” 2=”” 2=”” 2=”” 3=”” 3=”” 3=”” 3=”” 3=”” 3=”” …=”” 0=”” 1=”” 2=”” 3=”” 4=”” 0=”” 1=”” 2=”” 3=”” 4=”” 1=”” 2=”” 3=”” 4=”” 1=”” 2=”” 3=”” 4=”” 3=”” 4=”” …=”” “`=”” ¡espero=”” que=”” esto=””></combs[i].size(); j++){
    cout << combs[i][j] << ” “;
    }
    cout << endl;
    }


    esto debería imprimir:

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 …
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 …
    0 0 0 0 0 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 …
    0 1 2 3 4 0 1 2 3 4 1 2 3 4 1 2 3 4 3 4 …
    “`

    ¡espero que esto ayude!>

Comments are closed.