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
Libérer: 2024-12-08 17:11:12
original
420 Les gens l'ont consulté

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();
    }
}
Copier après la connexion

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;
            }
        }
    }
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal