问题
排列s有n个成员[x1,x2,…,xn],每个成员可以选取[1,2,…,m]这m种值。例如当n=3,m=3时,排列s有以下情况:
[1,1,1][2,1,1][1,2,1][1,1,2][2,2,1][2,1,2][1,2,2][2,2,2][3,1,1][1,3,1][1,1,3][3,3,1][3,1,3][1,3,3][3,3,3][2,3,1][3,2,1][2,1,3][3,1,2][1,2,3][1,3,2][2,2,3][2,3,2][3,2,2][3,3,2][3,2,3][2,3,3] 给定n,m的值,用Recursion求排列s的所有情况。
解法
BruteForce存在一个问题,外围for循环的数量固定,无法随着n的改变而改变。递归可以解决这个问题。
假设排列s的长度从0增长到n。初始化时令排列为空s=[]。
(1) 将排列s的长度增加到1,第1个元素(唯一的元素)x1有m种选择,即长度为1的排列s有m个排列组合:
[11][21]⋯[m1] (2) 将排列s的长度增加到2,得到s=[x1,x2],元素x2的选择可以看作在第(1)步的每个选择的基础上继续选择。对于[11]可以得到m个排列组合:
[11,12][11,22]⋯[11,m2] 源码
Recursion.h
Recursion.cpp
测试
RecursionTest.cpp