格雷码的递归和非递归算法

      n位格雷码的编码方式是在n-1为格雷码中逐个取出,进行如下操作后放入新的可增长容器内(初始长度为0),记当前容器长度为n:

     1.前面加0字符放在第[(n+1)/2]位置上,此时容器长度加1;

     2.前面加1字符放在第[(n+1)/2]位置上,此时容器长度加1

      基于这种算法思想,可以考虑递归的方法,下面是设计递归的小tricks:

'''
递归函数里面要有结束条件
如果一个状态可以由上一个状态唯一确定则可以用回溯递归
确定递归函数参数一般要包含一个idx的ID累加器
递归函数的参数中不变的可以写成全局变量
'''

def gray_code(n):#递归版
    length=int(math.pow(2,n))
    list=[ '' for i in range(length)]
    if n==1:
        list[0]='0'
        list[1]='1'
        return list
    list_before=gray_code(n-1)
    for i in range(len(list_before)):
        list[i]='0'+list_before[i]
        list[length-1-i]='1'+list_before[i]
    return list


def graycode(n):#非递归版
    list=['0','1']
    for i in range(2,n+1):
        new_list=[]
        for each in list:
            index=(len(new_list)+1)//2
            new_list.insert(index,'0'+each)
            index=(len(new_list)+1)//2
            new_list.insert(index,'1'+each)
        list=new_list
    return list

猜你喜欢

转载自blog.csdn.net/to_be_to_thought/article/details/79903645