[wplug] OT - programming logic help
Chris Romano
romano.chris at gmail.com
Thu Apr 23 11:50:45 EDT 2009
On Thu, Apr 23, 2009 at 11:39 AM, Ryan W. Frenz <rfrenz at gmail.com> wrote:
>> On Thu, Apr 23, 2009 at 10:58 AM, Chris Romano <romano.chris at gmail.com> wrote:
>>> Here are all the possible combos ... (it's easy to do on paper, just
>>> can't figure how to do this with code).
>
> Hi Chris,
>
> The below is in C++, but like you said, the logic should transfer to
> any language. The key is the recursion.
>
> Ryan
>
> #include <iostream>
> #include <vector>
> #include <algorithm>
>
> typedef std::vector<int> NumberList;
> typedef std::vector<NumberList> ListPermutation;
>
> ListPermutation getPermutations(NumberList numbers) {
> ListPermutation returns;
>
> // Prune the recursion, just return both permutations of the pair.
> if (numbers.size() == 2) {
> returns.push_back(numbers);
> std::swap(numbers[0], numbers[1]);
> returns.push_back(numbers);
> return returns;
> }
>
> int index = 0;
> for (NumberList::const_iterator nIt = numbers.begin(); nIt !=
> numbers.end(); ++nIt, ++index) {
> // Remove the current number and compute permutations of the others.
> NumberList otherNumbers(numbers);
> otherNumbers.erase(otherNumbers.begin() + index);
>
> // Add the 'fixed' number to the sub-permutations.
> const ListPermutation subPerm = getPermutations(otherNumbers);
> for (ListPermutation::const_iterator lpIt = subPerm.begin(); lpIt !=
> subPerm.end(); ++lpIt) {
> NumberList fullPerm; fullPerm.push_back(*nIt);
> fullPerm.insert(fullPerm.end(), (*lpIt).begin(), (*lpIt).end());
> returns.push_back(fullPerm);
> }
> }
>
> return returns;
> }
>
> int main(int argc, char* argv[]) {
> NumberList vals;
> vals.push_back(1);
> vals.push_back(2);
> vals.push_back(3);
> vals.push_back(4);
> vals.push_back(5);
>
> const ListPermutation perms = getPermutations(vals);
> for (ListPermutation::const_iterator pIt = perms.begin(); pIt !=
> perms.end(); ++pIt) {
> for (NumberList::const_iterator ppIt = (*pIt).begin(); ppIt !=
> (*pIt).end(); ++ppIt)
> std::cerr << *ppIt << " ";
> std::cerr << "\n";
> }
> }
>
It's been a while since I looked at C++ or really any OOP code but I
will start digging through that. Thanks
And George ... thanks for the link. I'm reading through that now
--
"They that would trade essential liberty for a little temporary safety
deserve neither." -- Benjamin Franklin
More information about the wplug
mailing list