A backtracking approach to generate n bit Gray Codes
Last Updated :
05 Feb, 2024
Given a number n, the task is to generate n bit Gray codes (generate bit patterns from 0 to 2^n-1 such that successive patterns differ by one bit)
Examples:
Input : 2
Output : 0 1 3 2
Explanation :
00 - 0
01 - 1
11 - 3
10 - 2
Input : 3
Output : 0 1 3 2 6 7 5 4
We have discussed an approach in Generate n-bit Gray Codes
This article provides a backtracking approach to the same problem. Idea is that for each bit out of n bit we have a choice either we can ignore it or we can invert the bit so this means our gray sequence goes upto 2 ^ n for n bits. So we make two recursive calls for either inverting the bit or leaving the bit as it is.
C++
#include <iostream>
#include <vector>
using namespace std;
void grayCodeUtil(vector< int >& res, int n, int & num)
{
if (n == 0) {
res.push_back(num);
return ;
}
grayCodeUtil(res, n - 1, num);
num = num ^ (1 << (n - 1));
grayCodeUtil(res, n - 1, num);
}
vector< int > grayCodes( int n)
{
vector< int > res;
int num = 0;
grayCodeUtil(res, n, num);
return res;
}
int main()
{
int n = 3;
vector< int > code = grayCodes(n);
for ( int i = 0; i < code.size(); i++)
cout << code[i] << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int num;
static void grayCodeUtil(Vector<Integer> res, int n)
{
if (n == 0 )
{
res.add(num);
return ;
}
grayCodeUtil(res, n - 1 );
num = num ^ ( 1 << (n - 1 ));
grayCodeUtil(res, n - 1 );
}
static Vector<Integer> grayCodes( int n)
{
Vector<Integer> res = new Vector<Integer>();
num = 0 ;
grayCodeUtil(res, n);
return res;
}
public static void main(String[] args)
{
int n = 3 ;
Vector<Integer> code = grayCodes(n);
for ( int i = 0 ; i < code.size(); i++)
System.out.print(code.get(i) + "\n" );
}
}
|
Python3
def grayCodeUtil(res, n, num):
if (n = = 0 ):
res.append(num[ 0 ])
return
grayCodeUtil(res, n - 1 , num)
num[ 0 ] = num[ 0 ] ^ ( 1 << (n - 1 ))
grayCodeUtil(res, n - 1 , num)
def grayCodes(n):
res = []
num = [ 0 ]
grayCodeUtil(res, n, num)
return res
n = 3
code = grayCodes(n)
for i in range ( len (code)):
print (code[i])
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int num;
static void grayCodeUtil(List< int > res, int n)
{
if (n == 0)
{
res.Add(num);
return ;
}
grayCodeUtil(res, n - 1);
num = num ^ (1 << (n - 1));
grayCodeUtil(res, n - 1);
}
static List< int > grayCodes( int n)
{
List< int > res = new List< int >();
num = 0;
grayCodeUtil(res, n);
return res;
}
public static void Main(String[] args)
{
int n = 3;
List< int > code = grayCodes(n);
for ( int i = 0; i < code.Count; i++)
Console.Write(code[i] + "\n" );
}
}
|
Javascript
<script>
function grayCodeUtil(res, n, num)
{
if (n == 0)
{
res.push(num[0]);
return ;
}
grayCodeUtil(res, n - 1, num);
num[0] = num[0] ^ (1 << (n - 1));
grayCodeUtil(res, n - 1, num);
}
function grayCodes(n)
{
let res = [];
let num = [0];
grayCodeUtil(res, n, num);
return res;
}
let n = 3;
let code = grayCodes(n);
for (let i = 0; i < code.length; i++)
document.write(code[i] + "<br>" );
</script>
|
Output:
0
1
3
2
6
7
5
4
Time Complexity: O(2n)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...