生成格雷碼

2021-07-10 23:07:21 字數 1826 閱讀 8215

[程式設計題] 生成格雷碼

在一組數的編碼中,若任意兩個相鄰的**只有一位二進位制數不同, 則稱這種編碼為格雷碼(gray code),請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。

給定乙個整數n,請返回n位的格雷碼,順序為從0開始。

測試樣例:

1
返回:["0","1"]

思想:

用遞迴法實現,把求n位格雷碼分解為求n-1位格雷碼的子問題,以及如何由n-1位格雷碼構造n位格雷碼的子問題。

第二個子問題,即依次遍歷格雷碼,在每一編碼的末尾新增「0」或"1"。

用c++實現,如下**

// graycode.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include#include#includeusing namespace std;

class graycode if (n <= 0)

vectorpost = getgray(n - 1);

bool direction = true;

for (vector::iterator itr = post.begin(); itr != post.end(); itr++)

else

} return ret;

}};int main()

} return 0;

}

語言要點:

使用vector容器,vectorvs = vector()定義容器;

vs.push_back()往容器末尾新增元素;

vector::iterator 獲得迭代器型別;

vector::iterator it = vs.begin()得到迭代器頭;

it != vs.end()判斷迭代器是否還未結束;

it++將迭代器指向下乙個元素;

*it 表示取迭代器當前指向的那個元素。

go實現

package main

import (

"container/list"

"errors"

"fmt"

"strconv"

"strings"

)func main() }}

func garycode(n int) (ret *list.list, _ error)

ret = list.new()

if n == 1 else else

} }return ret, nil

}

語言要點:

通過 fmt.scanln() 從標準輸入讀取一行字串,字串包含換行符

通過strings.replace()函式,替換掉多餘的空格和換行符;

通過strconv.atoi()函式,把字串轉換成整數

使用list容器,通過 ret := list.new() 建立並返回list列表指標;

ret.pushback()往列表末尾新增元素;

通過e := gc.front()獲取列表頭元素指標;

通過 e != nil 判斷當前指向元素不為空;

通過e.next()指向列表下乙個元素;

通過e.value()取e指向元素的值,元素的型別是inte***ce,通過.(string)強調元素值型別是string;合在一起就是e.value().(string)。

吐槽:go語言真是沒說的那麼好用,麻煩。

生成格雷碼

題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 1 n 1時,返回0,1 2 n 2時,返回00,01,10,...

自動生成格雷碼

出處 blog.csdn.net beiyeqingteng 問題 產生n位元的所有格雷碼。格雷碼 gray code 是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數字,任兩個數之間只有乙個位元值不同。例如以下為3位元的格雷碼 000 001 011 010 110 111 10...

遞迴生成格雷碼

遞迴生成格雷碼 當n 1時,當n 2時,當n 3時,n位格雷碼共有2 n個元素。其中每個元素是 n 1 位的格雷碼前面加0,然後再反向後前面加1生成的。如n 3可由n 2進行兩步操作後得到 1.在n 2的格雷碼前面加0,生成 000,001,011,010 2.在n 2的格雷碼逆序後前面加1,生成 ...