>백엔드 개발 >C++ >재귀와 반복을 사용하여 벡터의 데카르트 곱을 구현하는 방법은 무엇입니까?

재귀와 반복을 사용하여 벡터의 데카르트 곱을 구현하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-08 17:11:12345검색

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

재귀 및 반복을 사용하여 벡터 데카르트 곱 구현

다양한 크기의 벡터 항목으로 구성된 벡터가 있고 데카르트 함수를 생성하려고 합니다. 해당 요소의 제품.

먼저 재귀적 접근 방식을 사용할 수 있습니다.

// 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();
    }
}

이제 반복 접근 방식을 고려해 보세요.

// 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;
            }
        }
    }
}

위 내용은 재귀와 반복을 사용하여 벡터의 데카르트 곱을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.