python 递归实现二进制字符串(位串)相差固定汉明距离的所有位串

题目来自 程序设计导论(python 语言实践)的第二章,题目如下:

Hamming distance. The Hamming distance between two bit strings of length n is equal to the number of bits in which the two strings differ. Compose a program that takes an integer k and a bit string s from the command line, and writes all bit strings that have Hamming distance at most k from s

汉明距离,两个长度为 n 的二进制字符串(简称位串)的汉明距离定义为两个位串自检不同位的个数,编写一个程序,实现如下功能:带两个参数:汉明距离 k (整数) ,二进制字符串 s,输出与 s 的汉明距离为 k 的所有位串。

想了很久,都没有想出如何通过递归实现。在 stackoverflow.com 上的大神给出了代码,一开始还没看懂(有点小尴尬)

原文链接地址:点击打开链接

现将代码贴出,并进行简单的注释和扩展

# 反转字符,0 变 1,1 变 0
def flip(c):
    return str(1-int(c))


# 将字符串 s 中位置 i 的字符进行反转
def flip_s(s, i):
    t = s[:i] + flip(s[i]) + s[i+1:]
    return t


# 递归实现
def hamming(s, k):
    if k > 1:
        c = s[-1]
        # # s1 = [y+c for y in hamming(s[:-1], k)] if len(s) > k else []
        s1 = []
        if len(s) > k:
            for y in hamming(s[:-1], k):
                s1 += [y + c]
        else:
            s1 = []

        # s2 = [y+flip(c) for y in hamming(s[:-1], k-1)]
        s2 = []
        for y in hamming(s[:-1], k-1):
            s2 += [y + flip(c)]

        r = []
        r.extend(s1)
        r.extend(s2)
        return r
    else:
        return [flip_s(s, i) for i in range(len(s))]

print(hamming("0000", 2))

# >>> ['1100', '1010', '0110', '1001', '0110', '0011']

# 递归跟踪示意
'''
hanming('0000', 2):
    2 > 1    # (True, k == 2)
        c = '0'    # ('0000'[-1] == '0')
        4 > 2      # (True, len('0000') == 4)
            s1 = [y + '0' for y in hamming('000', 2)]
                hamming('000', 2)
                    2 > 1    # (True, k == 2)
                        c = '0'     # ('000'[-1] == '0')
                        3 > 2       # (True, len('000') == 3)
                            s1 = [y + '0' for y in hamming('00', 2)]
                                hamming('00', 2)
                                    2 > 1    # (True, k == 2)
                                        c = '0'    # ('00'[-1] == '0')
                                        2 > 2      # (False, len('00') == 2)
                                            s1 = []
                                        s2 = [y + flip('0') for y in hamming('0', 1)]
                                            hamming('0', 1)
                                                1 > 1    # (False, k == 1)
                                                    ['1']    # ([flip_s('0', i) for i in range(len('0'))])
                                                return ['1']
                                            s2 = ['11']
                                        r.extend(s1), r.extend(s1)
                                        # (r = ['11'])
                                        return ['11'] 
                                s1 = ['110']
                        s2 = [y + flip('0') for y in hamming('00', 1)]
                            hanming('00', 1)
                                1 > 1 (False, k == 1)
                                ['10', '01']    # ([flip_s('00', i) for i in range(len('00'))])
                                return ['10', '01']
                            s2 = ['101', '011']
                        r.extend(s1), r.extend(s1)
                        # (r = ['110', '101', '011'])
                        return ['110', '101', '011'] 
                s1 = ['1100', '1010', '0110']
        s2 = [y + flip('0') for y in hamming('000', 1)]
            hamming('000', 1)
                1 > 1 (False, k == 1)
                ['100', '010', '001']    # ([flip_s('00', i) for i in range(len('00'))])
                return ['100', '010', '001']
            s2 = ['1001', '0110', '0011']
        r.extend(s1), r.extend(s1)
        # r = ['1100', '1010', '0110', '1001', '0110', '0011']
        return ['1100', '1010', '0110', '1001', '0110', '0011']
'''

### 回答1: 可以使用以下递归函数将十进制数转换为二进制数: ``` def decimal_to_binary(n): if n == 0: return '' else: return decimal_to_binary(n // 2) + str(n % 2) ``` 其中,`n` 是要转换的十进制数。如果 `n` 等于 0,返回空字符串。否则,将 `n` 除以 2 并向下取整,然后将余数转换为字符串并与递归调用的结果连接起来。 例如,将十进制数 13 转换为二进制数: ``` >>> decimal_to_binary(13) '1101' ``` 同样地,可以使用以下递归函数将二进制数转换为十进制数: ``` def binary_to_decimal(n): if len(n) == 0: return 0 else: return 2 * binary_to_decimal(n[:-1]) + int(n[-1]) ``` 其中,`n` 是要转换的二进制数。如果 `n` 的长度为 0,返回 0。否则,将 `n` 的前缀部分递归转换为十进制数并乘以 2,然后将 `n` 的最后一位转换为整数并加上这个结果。 例如,将二进制数 1101 转换为十进制数: ``` >>> binary_to_decimal('1101') 13 ``` ### 回答2: Python是一种常用的编程语言,它广泛应用于数据科学、机器学习、Web开发等领域。Python具有简单易学、表达式简洁、开发效率高等优点,在编写算法时也有诸多便利。本文将介绍如何使用Python递归实现十进制与二进制之间的转换。 1. 十进制转二进制 首先我们考虑如何将十进制数转换为二进制数。将一个十进制数转换为二进制数的方法是,将其不断除以2,并将余数逆序排列,直到商为0。例如,将十进制数9转换为二进制数,可以按如下步骤进行: ① 将9除以2,得商4余1; ② 将4除以2,得商2余0; ③ 将2除以2,得商1余0; ④ 将1除以2,得商0余1。 这样,我们就得到了9的二进制表示为1001。在Python中,我们可以使用递归方法来实现该过程。 具体实现如下: def decimalToBinary(n): if n == 0: return '' else: return decimalToBinary(n//2) + str(n%2) 上述代码中,decimalToBinary是实现十进制转换为二进制的函数,n是要转换的十进制数。如果n等于0,返回一个空字符串,否则将n除以2,取余数并转化为字符,然后将商作为新的n继续递归,最终得到一个二进制字符串。 2. 二进制转十进制 接下来我们考虑如何将二进制数转换为十进制数。将一个二进制数转换为十进制数的方法是,将其逐位展开,乘以相应的系数,累加得到十进制数。例如,将二进制数1011转换为十进制数,可以按如下步骤进行: ① 将二进制数逆序排列得到1101; ② 第0位乘以2^0=1,得到1; ③ 第1位乘以2^1=2,得到0; ④ 第2位乘以2^2=4,得到1; ⑤ 第3位乘以2^3=8,得到1; ⑥ 将以上结果累加得到十进制数1+0*2+1*4+1*8=13。 在Python中,我们可以使用递归方法来实现该过程。 具体实现如下: def binaryToDecimal(n): if n == '': return 0 else: return 2*binaryToDecimal(n[:-1])+int(n[-1]) 上述代码中,binaryToDecimal是实现二进制转换为十进制的函数,n是要转换的二进制数。如果n等于字符串,返回0,否则将n字符串逆序,取除最后一位以外的部分作为新的n递归,将最后一位转换为int类型并乘以2,再将结果与递归结果相加,最终得到一个十进制数。 总结 本文介绍了如何使用Python递归实现十进制与二进制之间的转换。递归是一种重要的编程技巧,可以简化代码、增加可读性和可维护性。通过本文的介绍,希望读者能够更深入地理解Python递归原理,使用Python更高效地实现算法和数据结构。 ### 回答3: 在Python中,可以使用递归算法实现十进制与二进制之间的转换。递归算法就是把一个大问题逐步细化成为更小的子问题,并在每个子问题中调用自身来解,直到能解决最小的子问题。具体的实现方法如下: 1. 实现十进制转二进制递归函数 ```python def decimal_to_binary(decimal_num: int) -> str: """ 实现十进制转二进制递归函数 """ if decimal_num == 0: # 程序终止条件 return "0" elif decimal_num == 1: # 程序终止条件 return "1" else: # 递归调用本函数,解小规模问题 return decimal_to_binary(decimal_num // 2) + str(decimal_num % 2) ``` 上述代码中,函数名为`decimal_to_binary`,接收一个参数`decimal_num`,表示要转换的十进制数,返回一个字符串类型的二进制数。在函数体中,我们首先判断程序应该终止的条件——如果十进制数为0或1,则其对应的二进制数也分别为0或1。接着,我们调用自身来解较小规模的问题,即取十进制数的整数部分,不断地把它除以2,直到商为0为止,拼接余数即为所二进制数。 2. 实现二进制转十进制的递归函数 ```python def binary_to_decimal(binary_num: str) -> int: """ 实现二进制转十进制的递归函数 """ if len(binary_num) == 1: # 程序终止条件 return int(binary_num) else: # 递归调用本函数,解小规模问题 return binary_to_decimal(binary_num[:-1]) * 2 + int(binary_num[-1]) ``` 对于二进制转十进制,我们也可以采用递归算法。函数名为`binary_to_decimal`,接收一个参数`binary_num`,表示要转换的二进制数,返回一个整数类型的十进制数。在函数体中,我们首先判断程序应该终止的条件——如果二进制数的长度为1,则其对应的十进制数也为1。接着,我们调用自身来解较小规模的问题,即取二进制数的前n-1位,不断地把结果乘以2,然后加上最后一位数即可。 递归算法可读性好、易于理解,但在计算机中的运行效率较低。因此,在实际应用中,可以使用循环或者位运算等方法实现二进制与十进制的转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值