密码组合算法

import typing


def compound_mode(suq:typing.Iterable, length: int = 1) -> list[str]:
    """
    :param suq: 待组合的元素,将其视作密码所用到所有可能的字符
    :param length: 密码长度
    :return: 所有可能的密码
    """
    '''
    实现思路: 先从最简单的一位数密码入手,获得所有可能的组合。
    然后将第二位所有可能出现的字符与前边的分别组合,获得二位密码所有可能的组合
    然后将第三位所有可能的字符再与前两位所有的组合分别搭配,获得三位数密码所有可能
    的组合,依次下去,直到长度达到预设参数length。
    总共有length位字符,每一位上都有len(suq)种可能性
    所以总共有len(suq) ** length种不同的组合方式
    这种方式类似于递归,即要想知道规模为n的问题的解,就先得到(n - 1)规模问题的解
    要先知道(n - 1)的解就要获取(n - 2)的解。就这样依次进行下去(n - 3)(n - 4)...
    直到(n - m)为1时,就将一个大规模问题拆解成了最简问题,此时结果就显而易见了
    然后再将此结果为基准,规模递增的运算回去即可
    当然,代码中的递归说白了就是函数自己调用自己,这种方式适合O(log n)时间复杂度的算法
    即每次调用都会将问题规模缩小一半,这样递归的次数就会很少。不然当问题规模较大时会有爆栈的风险
    当然,基本上所有的递归都可以使用循环代替
    '''
    # 这里先获取最基本的一位数密码的组合方式,统一将所有成员转成字符串
    res = [str(i) for i in suq]
    # 然后从第二位开始循环,所以循环次数为length - 1
    for i in range(length - 1):
        res = [x + str(y) for x in res for y in suq]
    # 在python中,有一个itertools模块也提供了类似的函数
    
    # 值得一提的是平常计算机所用的密码组合为:为英文字母 + 阿拉伯数字(有些可以使用下划线,小数点等特殊字符)
    # 即26 * 2(大小写) + 10 = 62  个字符
    # 通常在20位以内,如果可以确定密码的位数为n,则所有的组合方式为 62 ** n
    # 如果确定不了具体有几位,只知道最多有m位,那么所有可能的组合方式就是: 62 ** 1 + 62 ** 2 + 62 ** 3 + ... + 62 ** m 
    return res
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值