Given 2 integers n and start. Your task is return any permutation p of (0,1,2.....,2^n -1) such that :
p[0] = start
p[i] and p[i+1] differ by only one bit in their binary representation.
p[0] and p[2^n -1] must also differ by only one bit in their binary representation.
Example 1:
Input: n = 2, start = 3
Output: [3,2,0,1]
Explanation: The binary representation of the permutation is (11,10,00,01). 
All the adjacent element differ by one bit. Another valid permutation is [3,1,0,2]
Example 2:
Input: n = 3, start = 2
Output: [2,6,7,5,4,0,1,3]
Explanation: The binary representation of the permutation is (010,110,111,101,100,000,001,011).
Constraints:
1 <= n <= 16
0 <= start < 2 ^ n
class Solution:
    def circularPermutation(self, n: int, start: int) -> List[int]:
        return self.solve(start, n)
    def solve(self, num, length):
        if length==1:
            if num==1:
                return [1, 0]
            return [0, 1]
        firstnum=1
        if num<2**(length-1):
            firstnum=0
        res=self.solve(num-firstnum*2**(length-1), length-1)
        ans=[]
        for i in res:
            ans.append(firstnum*2**(length-1)+i)
        res.reverse()
        for i in res:
            ans.append((1-firstnum)*2**(length-1)+i)
        return ans
class Solution:
    def circularPermutation(self, n: int, start: int) -> List[int]:
        return self.solve(start, n)
    def solve(self, num, length):
        if length==1:
            if num==1:
                return [1, 0]
            return [0, 1]
        firstnum=1
        if num<2**(length-1):
            firstnum=0
        res=self.solve(num-firstnum*2**(length-1), length-1)
        ans=[]
        for i in res:
            ans.append(firstnum*2**(length-1)+i)
        res.reverse()
        for i in res:
            ans.append((1-firstnum)*2**(length-1)+i)
        return ans