如何通过递归获取字符串的所有连续子串?

时间:2017-01-17 20:09:55

标签: python python-2.7

这是迭代版本。如何使用递归代码获得相同的结果?

def it(word):
  set1 = set()
  for begin in range(len(word)):
      for end in range(begin,len(word)):
         set1.add(word[begin:end+1])
return set1

这就是我所拥有的,但它并没有给每个子串返回

def recursievesubstring(string):
   lijst = []
   if len(string) == 0:
       lijst.append("")
   else:
       i = 0
       if len(string) > 1:
            midden = len(lijst)//2
            lijst.append(string[midden+1])
       while i < len(string):
            lijst.append(string[:i])
            lijst.append(string[i:])
            recursievesubstring(string[i:-i])
            i+=1
  return lijst

def main():
    string = input("Geef een woord: ")
    print(recursievesubstring(string))

2 个答案:

答案 0 :(得分:1)

您需要制作可以采用更多参数的辅助方法。 (尾递归)如果限制是编写递归函数,则不能使用任何for或while循环。

答案 1 :(得分:1)

使复杂化的原因是你有一个双重迭代,所以一种方法来攻击它,为每个循环制作一个递归函数并将它们组合起来,这意味着一个处理内循环的辅助函数和处理外循环的主函数环。

为此,我们需要了解迭代函数的工作原理,简单的打印将有助于

def it(word):
    set1 = set()
    for begin in range(len(word)):
        for end in range(begin,len(word)):
            set1.add(word[begin:end+1])
            print(word[begin:end+1])
        print()
    return set1

一个简单的测试揭示了一个有用的模式

>>> x=it("abcdef")
a
ab
abc
abcd
abcde
abcdef

b
bc
bcd
bcde
bcdef

c
cd
cde
cdef

d
de
def

e
ef

f

>>> 

使目标更清晰,辅助函数接受一个字符串并删除最后一个字符或每次更大一些子字符串,而main函数将删除每个递归调用中的第一个字符。

现在我不会给你一个有效的代码,而是一个使用tail recursion的模板,供你完成

def recur_aux(word, result=None, end=None):
    if result is None:
        result = set()
    if end is None:
        end = # an adequate default value
    if #an adequate stop condition, aka base case:
        return result
    else:
        #do an adequate step
        return recur_aux( word, result, #end + or - 1 )

def recur(word,result=None):
    if result is None:
        result = set()
    if word: #this is equivalent to len(word)!=0
        #do a adequate step calling recur_aux
        return recur( # an adequate recursive call )
    else:
        return result

尝试一下,然后像这样进行测试

>>> it("abcdef") == recur("abcdef")