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

      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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值