【发布时间】:2019-11-26 19:28:27
【问题描述】:
我的问题可能不清楚,但我正在尝试获取所有可能的 10 个字符长度的字符串组合。这是我的代码:
def printPwd(set, k):
n = len(set)
pwdRec(set,"", n, k)
def pwdRec(set, prefix, n, k):
if k==0:
print(prefix)
return
for i in range(n):
nPrefix = prefix + set[i]
nk = k-1
pwdRec(set, nPrefix, n, nk)
chars = list("abcdefghijklmno.@-_&")
length = 10
printPwd(chars, length)
它输出如下内容:
aaaaabcde@
aaaaabcde-
aaaaabcde_
aaaaabcdfg
...
我得到了五个“a”,但我不知道如何解决它
【问题讨论】:
-
不是您问题的答案,而是另一种选择:
import itertools as it; print(list(map("".join, it.permutations("abcdefghijklmno.@-_&", 10))))。注意:可能是一个很长的输出,所以从一个小的输入字符串和一个小的长度开始。 -
这可能是完全错误的,但我相信问题是当你调用你的递归函数时,你并没有删除你刚刚看到的集合的字符。你应该调用 pwdRec(set[i:], nPrefix, n, nk)
-
查看这个可爱的debug 博客寻求帮助。在每个函数的顶部放置一个
print语句来回显输入参数;这通常会显示递归错误。 -
@0 0,您的答案给出了组合列表。在我检查它是否是正确的密码之前,它必须搜索所有组合。因此,如果密码在中间,那将花费不必要的时间。 @alex067,它给出了相同的结果。谢谢大家
-
您可以在不计算列表的情况下迭代排列,然后中途退出(请注意,您的问题是“我正在尝试使 all 成为可能”;您的评论已更改问题)。不同之处在于我评论中的排列不重用元素;如果你愿意,你可以使用
itertools.combinations_with_replacement;请参阅 itertools 文档。
标签: python loops combinations brute-force