Maison >développement back-end >C++ >Comment implémenter un produit cartésien de vecteurs en utilisant la récursion et l'itération ?

Comment implémenter un produit cartésien de vecteurs en utilisant la récursion et l'itération ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-08 17:11:12354parcourir

How to Implement a Cartesian Product of Vectors Using Recursion and Iteration?

Implémentation d'un produit cartésien vectoriel avec récursion et itération

Vous disposez d'un vecteur d'éléments vectoriels de tailles variables et vous cherchez à générer un produit cartésien produit de leurs éléments.

Tout d'abord, une approche récursive peut être utilisée :

// Recursive Cartesian product function
void cart_product(
    Vvi& rvvi,  // Result vector of vectors
    Vi& rvi,   // Current vector
    Vvi::const_iterator me, // Current vector in input
    Vvi::const_iterator end) // Input vector end
{
    if (me == end) {
        // Push the current result to the final result
        rvvi.push_back(rvi);
        return;
    }
    
    // Iterate through the current vector
    const Vi& mevi = *me;
    for (Vi::const_iterator it = mevi.begin(); it != mevi.end(); it++) {
        // Add current element to result
        rvi.push_back(*it);
        
        // Recurse to add subsequent elements
        cart_product(rvvi, rvi, me + 1, end);
        
        // Remove added element for further recursion
        rvi.pop_back();
    }
}

Maintenant, considérons l'approche itérative :

// Iterative Cartesian product function
void cart_product(
    Vvi& out,  // Result vector of vectors
    Vvi& in)  // Input vector of vectors
{
    Vd vd; // Vector of iterator structs
    // Initialize iterators to start of vectors
    for (Vvi::const_iterator it = in.begin(); it != in.end(); ++it) {
        Digits d = {(*it).begin(), (*it).end(), (*it).begin()};
        vd.push_back(d);
    }
    
    // Iterative loop to generate product vectors
    while (1) {
        // Create result vector from iterated elements
        Vi result;
        for (Vd::const_iterator it = vd.begin(); it != vd.end(); it++) {
            result.push_back(*(it->me));
        }
        out.push_back(result);
        
        // Increment iterator
        // Reset iterator at end, increment neighboring iterator
        for (Vd::iterator it = vd.begin(); ; ) {
            ++(it->me);
            if (it->me == it->end) {
                if (it + 1 == vd.end()) {
                    // End of product
                    return;
                } else {
                    // Cascade reset
                    it->me = it->begin;
                    ++it;
                }
            } else {
                // Break from loop
                break;
            }
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn