Во-первых, давайте исправим вашу функцию в итеративной версии, которая работает.
def substring(strings):
final = []
for string in strings:
while string:
final.append(string)
string = string[1:]
return final
Далее, давайте переместим переменную final
в аргументы, чтобы рекурсивные вызовы функции могли основываться на списке.
def substring(strings, final=None):
if final is None: final = []
for string in strings:
while string:
final.append(string)
string = string[1:]
return final
Следующий шаг - преобразование for
l oop в рекурсию. Мы можем видеть, что базовый случай - это когда список strings
пуст, а рекурсивный случай должен работать с каждым элементом strings
. Для рекурсивного случая здесь мы извлечем первый элемент strings
и передадим остальную часть списка рекурсивному вызову.
def substring(strings, final=None):
if final is None: final = []
# base case: empty list
if not strings: return final
# recursive case:
# work on first string in list
string = strings[0]
# add all substrings to final
while string:
final.append(string)
string = string[1:]
return substring(strings[1:], final)
Преобразование while
l oop в рекурсию аналогичный процесс: найдите базовый случай (пустой string
) и рекурсивный случай (добавив одну подстроку к final
) и сделайте рекурсивный вызов для рекурсивного случая.
def substring(strings, final=None):
if final is None: final = []
if not strings: return final
string = strings[0]
if not string: return substring(strings[1:], final)
final.append(string)
strings[0] = string[1:]
return substring(strings, final)
И, наконец, немного очистки.
def substring(strings, final=None):
if final is None: final = []
if not strings: return final
if not string[0]: return substring(strings[1:], final)
final.append(string)
strings[0] = string[0][1:]
return substring(strings, final)