再帰と反復によるベクトル デカルト積の実装
さまざまなサイズのベクトル項目のベクトルがあり、デカルト積を生成しようとしています。それらの要素の産物です。
まず、再帰的アプローチを使用できます:
// 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 中国語 Web サイトの他の関連記事を参照してください。