格雷码递归生成的简单实现
一个c++递归生成格雷码的简单算法。
#include <iostream>
#include <string>
#include <vector>
using namespace std;

/***************************/
/*
0  1
00 01   11 10
000 001 011 010   110 111 101 100
0000 0001 0011 0010 0110 0111 0101 0100   1100 1101 1111 1110 1010 1011 1001 1000
*/

void getGrayCode(vector<string> &v, int cnt) {
    if (cnt == 1) {
        v.push_back("0");
        v.push_back("1");
        return;
    }
    getGrayCode(v, cnt - 1);
    vector<string> vecTmp = v;
    reverse(vecTmp.begin(), vecTmp.end());
    for (size_t i = 0; i < vecTmp.size(); i++) {
        v[i] = "0" + v[i];                        //前半部分由上个数量级的格雷码在前面加 “0”      
        vecTmp[i] = "1" + vecTmp[i];              //后半部分由上个数量级的格雷码倒序后在前加 “1”       
        v.push_back(vecTmp[i]);
    }
}

int main() {
    vector<string> grayCode;
    int cnt = 0;
    while (true) {
        cin >> cnt;
        if (cnt <= 0) {
            cout << "所输入数字不符合要求(>0), 请重试!" << endl;
        }
        else {
            break;
        }
    }
    getGrayCode(grayCode, cnt);

    for (size_t i = 0; i < grayCode.size(); i++) {
        cout << grayCode[i] << " ";
        if(i+1 % 8 == 0){
            cout << endl;
        }
    }
    cout << "\n\n";
    system("PAUSE");
    return 0;
}

 
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门