Python递归函数,索引超出范围

时间:2019-04-18 23:08:13

标签: python python-3.x recursion

我正在尝试在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

4 个答案:

答案 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)

您的程序中仍然存在逻辑问题,但这将使您进入下一步。我强烈建议您做三件事:

  1. 请参阅这个可爱的debug博客以获取帮助。
  2. 使用增量编程-一次只写2-4行,一小段代码。在继续之前,请确保它们能正常工作。您需要这么多SO问题的部分原因是,在测试之前,您已在函数中引入了多个错误。当您有几种原因在咬你时,就无法轻易找出问题的原因
  3. 在线研究其他人解决此问题的方式;他们的指导可能会有助于消除代码中的其余问题。

答案 2 :(得分:0)

您不需要for行。您可以删除它。

只需将chr = str[i]替换为chr = str[0],然后按照之前的帖子(chrstr)中的说明重命名变量即可。

它会做你想要的。

答案 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')]