我正在尝试在python中编写递归函数,并且在进行某些调用后,它将索引超出范围。但是,我无法理解为什么?
有人可以帮助我理解吗?
def find_combinations(str, remaining_char=""):
print("find_combinations(%s, %s)" % (str, remaining_char))
if len(str) == 0:
print(remaining_char)
else:
for i in range(len(str)):
chr = str[i] # at this line it shows index out of bound
remaining_char = remaining_char+chr
str = str[1:]
find_combinations(str, remaining_char)
find_combinations("ABCD")
错误:
find_combinations(BCD, A)
find_combinations(CD, AB)
find_combinations(D, ABC)
find_combinations(, ABCD)
ABCD
...
...
chr = str[i]
IndexError: string index out of range
答案 0 :(得分:2)
首先,重命名您的字符串和char。目前,您正在tableView.register(UINib(nibName: "commentTableViewCell", bundle: nil), forCellReuseIdentifier: "commentCell")
和str()
您的错误来自以下事实:一旦您从字符串中删除了所有内容,与之匹配的旧值索引将不再可用
chr()
输出
def find_combinations(strz, remaining_char=""):
print("find_combinations(%s, %s)" % (strz, remaining_char))
if not strz:
print(remaining_char)
else:
for i in range(len(strz)):
print(i)
print(strz)
chrz = strz[i] # at this line it shows index out of bound
remaining_char = remaining_char+chrz
strz = strz[1:]
find_combinations(strz, remaining_char)
find_combinations("ABCD")
如您所见,列表索引find_combinations(ABCD, )
0
find_combinations(BCD, A)
0
find_combinations(CD, AB)
0
find_combinations(D, ABC)
0
find_combinations(, ABCD)
ABCD
1
超出范围
答案 1 :(得分:0)
看看您在做什么:考虑4个字符的字符串。
for i in range(len(str)):
chr = str[i]
str = str[1:]
i str
0 ABCD
1个ABC
2 AB
...并且下次您尝试访问str[i]
时,字符串太短。
保持原始字符串完整无缺;仅将截断的一个发送到递归中:
for i in range(len(s)):
chr = s[i]
remaining_char += chr
find_combinations(s[1:], remaining_char)
您的程序中仍然存在逻辑问题,但这将使您进入下一步。我强烈建议您做三件事:
答案 2 :(得分:0)
您不需要for
行。您可以删除它。
只需将chr = str[i]
替换为chr = str[0]
,然后按照之前的帖子(chr
和str
)中的说明重命名变量即可。
它会做你想要的。
答案 3 :(得分:0)
您始终可以使用itertools.permutations,这是python提供的功能。下面的示例生成考虑了所有4个字符的排列
import itertools as it
words = list('ABCD')
print(list(it.permutations(words, 4)))
'''[('A', 'B', 'C', 'D'), ('A', 'B', 'D', 'C'), ('A', 'C', 'B', 'D'),
('A', 'C', 'D', 'B'), ('A', 'D', 'B', 'C'), ('A', 'D', 'C', 'B'),
('B', 'A', 'C', 'D'), ('B', 'A', 'D', 'C'), ('B', 'C', 'A', 'D'),
('B', 'C', 'D', 'A'), ('B', 'D', 'A', 'C'), ('B', 'D', 'C', 'A'),
('C', 'A', 'B', 'D'), ('C', 'A', 'D', 'B'), ('C', 'B', 'A', 'D'),
('C', 'B', 'D', 'A'), ('C', 'D', 'A', 'B'), ('C', 'D', 'B', 'A'),
('D', 'A', 'B', 'C'), ('D', 'A', 'C', 'B'), ('D', 'B', 'A', 'C'),
('D', 'B', 'C', 'A'), ('D', 'C', 'A', 'B'), ('D', 'C', 'B', 'A')]'''
print(list(it.permutations(words, 2)))
#[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'A'), ('B', 'C'),
#('B', 'D'), ('C', 'A'), ('C', 'B'), ('C', 'D'), ('D', 'A'), ('D', 'B'), ('D', 'C')]