2017-01-17 2 views
-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]) 
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)) 
+1

Почему рекурсия ?? – Copperfield

+0

, потому что мой профессор так хочет. – Elias

+2

Вы должны, вероятно, сделать домашнее задание самостоятельно –

ответ

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 

>>> 

, которые делают задачу более clear, вспомогательная функция принимает строку и либо удаляет последний символ, либо каждый раз подбирает более строчную строчку, а основная функция удаляет первый символ в каждом рекурсивном вызове.

Теперь я не дал бы вам рабочий код, но шаблон, который используют 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") 
+0

Я знаю, что я не должен сказать спасибо, но я действительно хочу поблагодарить вас за ваше время! Я, конечно, возьму его попробовать. – Elias

+0

ok, дайте мне знать, если вы добились успеха :) – Copperfield

+0

mmm на втором, вам не нужен параметр 'end' ... – Copperfield

1

Вы должны сделать вспомогательные методы, которые могут принимать более аргументов. (Рекурсия хвоста) Если ограничение состоит в том, чтобы написать рекурсивную функцию, вы не можете использовать какие-либо петли for или while.

Смежные вопросы