Gray碼的遞迴與非遞迴C++實現
Gray碼又稱二進位制迴圈碼,簡單說就是任意兩個相鄰的程式碼只有一位不同。
一個n位的二進位制碼是由 2^n個Gray碼構成的一個集合。
格雷碼的編碼規律是:
第一步,改變最右邊的位元值; 第二步,改變右起第一個為1的位元的左邊位元; 第三步,重複第一步和第二步,直到所有的格雷碼產生完畢,即生成了2^n個n位的二進位制碼。 舉栗子:n = 0 編碼:0
n =1 編碼:0 1
n = 2 編碼:00 01 11 10
n = 3 編碼: 000 001 011 010 110 111 101 100
但是按這個規則程式設計並不簡單,觀察觀察下圖會發現,除了最高位(左邊第一位),格雷碼的位元完全上下對稱(看下面列表)。比如第一個格雷碼與最後一個格雷碼對稱(除了第一位),第二個格雷碼與倒數第二個對稱,以此類推
。
遞迴實現
class GrayCode { public: vector<string> getGray(int n) { int m = pow(2,n); vector<string>str(m); if(n<1)return {}; if(1==n){ str[0]="0"; str[1]="1"; return str; } vector<string>pre_gray = getGray(n-1); for(int i=0;i<pre_gray.size();i++){ str[i]="0" + pre_gray[i]; str[m-1-i]="1" + pre_gray[i]; } return str; } };
非遞迴實現:
vector<int> grayCode(int n) {
vector<int>res;
for(int i=0;i<(1<<n);i++){
res.push_back(i^(i>>1));
}
return res;
}
相關推薦
Gray碼的遞迴與非遞迴C++實現
Gray碼又稱二進位制迴圈碼,簡單說就是任意兩個相鄰的程式碼只有一位不同。 一個n位的二進位制碼是由 2^n個Gray碼構成的一個集合。 格雷碼的編碼規律是: 第一步,改變最右邊的位元值; 第二步,改變右起第一個為1的位元的左邊位元; 第三步,重複第一步和第二步,直
[計算機程式設計C++] Fibonaci數列的遞迴與非遞迴演算法實現
本文是對西安交通大學C++慕課第三章程式設計練習的16題的講解。 參考部落格:https://blog.csdn.net/zombie_slicer/article/details/38871799 題目內容: 編寫程式,顯示Fibonaci序列的前n項(從
樹的前、中、後序遍歷演算法(遞迴與非遞迴)、層序遍歷
二叉樹層次遍歷 非遞迴 void LevelOrder(Tree* T) { if(T == nullptr) return ; queue<Tree *> myqueue; myqueue.push(T); while(!myqueu
斐波那契(遞迴與非遞迴)
遞迴 long jumpFloor(int number) { if(number <= 0) return 0; else if(number == 1 ) return 1; return jumpFloor(number-1)
二叉樹的映象 遞迴與非遞迴
//*** 遞迴 **// void MirrorRecursively(TreeNode *pRoot) { if((pRoot == NULL) || (pRoot->left == NULL && pRoot->right == NULL))
斐波那契數列(遞迴與非遞迴)
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN = 1e2+10; ll a[MAXN]; ll F[MAXN]; ll f(ll n) ///遞迴 { if
n的階乘(遞迴與非遞迴)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll f(ll n)///遞迴演算法 { if(n==0 || n==1) return 1; else return n * f
資料結構之DFS遞迴與非遞迴遍歷鄰接表存圖
學習鄰接表存圖請看:https://blog.csdn.net/HPU_FRDHR/article/details/83957240 DFS (深度優先搜尋) 深度優先搜尋演算法(英語:Depth-First-S
揹包問題的遞迴與非遞迴演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
後續遍歷--遞迴與非遞迴(java版)
先訪問左右孩子,再訪問根節點。同樣還是採用棧的形式,但是問題是,先訪問左孩子出棧,根節點不能刪除,再訪問右孩子出棧,最後訪問根節點出棧。我們的思路是這樣的: 對於某個節點p: 1)將p壓入棧中,並將p所有的左孩子,全部壓入棧中: while(stk.
二叉樹深度(Depth)`遞迴`與`非遞迴`
二叉樹 (`Depth`)遞迴 深度優先遍歷 DFS 二叉樹的高度(深度)為二叉樹結點層次的最大值,也可以認為在根節點不為 nullptr 的情況下左右子樹的最大高度 + 1; 先序(後序)遍歷求解二叉樹高度(Depth)的遞迴演算法 演算法描述:深度優先遍歷
歸併排序的遞迴與非遞迴的寫法
歸併排序 歸併排序就是把兩組有序的陣列,合併成一個有序的陣列。至於如何分成兩個有序的陣列,遞迴的方法就是,把一個未排序的陣列,一直對半分,直到分成兩個陣列長度為1,然後一層一層合併上去。非遞迴的方法就是,在同一個陣列,從合併相鄰兩個長度為1的資料
斐波那契數列的遞迴與非遞迴的實現
0,1,1,2,3,5,8…這樣的數列稱作斐波那契數列 1、遞迴實現方式 //斐波那契數列遞迴實現 long long Fib1(long long n) { if (n<=1) retur
楊輝三角的C語言實現(遞迴與非遞迴)
本文用C語言程式碼實現楊輝三角 遞迴演算法依據於f(m,n)=f(m-1,n)+f(m-1,n-1) 其中(m,n)為楊輝三角第m行第n個元素 演算法程式碼如下: #include <stdio.h> //遞迴函式 int func(int m,in
斐波那契數列(Fibonacci)遞迴與非遞迴的效能對比
費波那契數列由0和1開始,之後的數就由之前的兩數相加 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584,………. 遞迴演算法 用遞迴演算法來求值,非常好理解.虛擬碼: f(n) =
[二叉樹] 遍歷方法總結--遞迴與非遞迴--純C實現
非遞迴方法: 思路一:根據訪問次序來入棧並輸出 思路二:模擬訪問過程 思路三:使用識別符號mark來記錄已經第幾次訪問該結點 /* @Desc:二叉連結串列 無頭結點 @Vesrion:0.0.1 @Time:20180922建立 */ #include
# 二分查詢的遞迴與非遞迴實現
二分查詢的遞迴與非遞迴實現 二分查詢也稱為折半查詢,首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果
[圖] 2 遍歷-DFS|BFS-遞迴與非遞迴
鄰接表 // DFS int visit[MAX_VERTEX_NUM]; void DFSUtil_AL(ALGraph G, int v) { ArcNode *p; visit[v]=1; Visit(G.vers[v].data); for (p
python快速排序遞迴與非遞迴
寫在前面 眾所周知,快速排序相對於選擇排序,插入排序,氣泡排序等初級排序有著天然的優勢。這是因為快排在交換元素的過程中,兩個發生交換的元素,距離較遠。比如插入排序,新的元素要在已經有序的序列中,一次又一次地找到它應該處於的位置,交換的次數遠遠高於快排。但是,使
排序演算法6——圖解歸併排序及其遞迴與非遞迴實現
排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非