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
06-13
1601
07-11
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交