#include #include #include using namespace std;
void showarr(int* arr, int len)
cout << endl;
}// 遞迴顯示組合
void recursivecomb(int arr, int len, int start)
if(start == len - 1)
for(int i = start; i < len; ++i)
recursivecomb(arr, len, start + 1);
swap(arr[start], arr[i]); }}
// 非遞迴顯示組合
void nonrecursivecomb(int arr, int len)
stacks; // 棧中第i個元素的值為ai,表示將陣列中的第i個元素與第ai個元素交換
s.push(0);
while(!s.empty())
while(!s.empty() && s.top() == len - 1)
// 換回原來的元素值
swap(arr[s.size() - 1], arr[s.top()]);
s.pop();
} if(!s.empty())
}}int main(int argc, char* argv)
; cout << "recursive:" << endl;
recursivecomb(arr, sizeof(arr) / sizeof(int), 0);
cout << "nonrecursive:" << endl;
nonrecursivecomb(arr, sizeof(arr) / sizeof(int));
return 0;
}
輸出結果:
recursive:
123132
213231
321312
nonrecursive:
123132
213231
321312
排列生成 遞迴
對於給定的n 1的集合,需要列印出該集合所有可能的排列。例如,如果這個集合是 a,b,c 那麼所有可能得排列是 1.a b c 2.a c b 3.b c a 4.b a c 5.c a b 6.c b a 即 a 加上 b,c 的所有排列 b 加上 a,c 的所有排列 c 加上 a,b 的所有排列...
全排列的遞迴與非遞迴
全排列是乙個十分基礎的概念,是一串有可比權值的元素出現的所有排列形式,例如 張全蛋 張蛋全 全張蛋 全蛋 張 蛋全張 蛋張全 就是張全蛋的全排列,所以我們發現全排列用來取名字是很不錯的,如果對每個漢字在名字中的權值做一 張表,再來一張可能出現的不同字同時出現在名字中的關聯權值表,那麼全排列可以算出一...
全排列 非遞迴
description 列出所有數字1到數字n的連續自然數的排列,要求所產生的任一數字序列中不允許出現得復數字。input 輸入 n 1 n 9 output 由1 n組成的所有不重複的數字序列,每行乙個序列。sample input 3 sample output 1 2 3 1 3 2 2 1 ...