学过数字电路的应该都认识格雷码,它由n位01字符串表示,相邻两个格雷码只有一位01不同。
长度(位) | (0,1)串 | |||
N=1 | 0 | 1 |
|
|
N=2 | 00 | 01 |
|
|
11 | 10 |
|
| |
N=3 | 000 | 001 | 011 | 010 |
110 | 111 | 101 | 100 |
根据上表,很容易得到递归的算法:
int a[ (1<<10) + 1 ]; void gray(int n) { if(n == 1){ a[1] = 0; a[2] = 1; return; } gray(n-1); for(int k = 1<<(n-1) , i = k ; i > 0 ; i–) a[ 2*k – i + 1 ] = a[i] + k; }