Возвращение правильно отформатированного рекурсивного списка в Python - PullRequest
0 голосов
/ 19 марта 2020

Это домашняя работа, которая разбила мне голову, и мне было интересно, если кто-нибудь может помочь мне понять, где я иду не так. По сути, у меня есть две строки, «а» и «б». Если «a» или «b» пусто, я возвращаю другую строку, в противном случае я возвращаю объединение, первый символ в каждой строке плюс рекурсивный вызов для остальной части каждой строки. Поэтому это вызывает у меня рекурсию, поэтому я создаю следующую функцию:

def myFunction(s, t):
    if len(s) == 0:
        return([t])
    if len(t) == 0:
        return([s])
    else:
        to_add = [[s[0]] + (myFunction(s[1:], t)), ([t[0]] + myFunction(s, t[1:]))]
        return(to_add)

, которая печатает при вызове функции с входами s = "ab" и t = "cd":

[['a', ['b', 'cd'], ['c', ['b', 'd'], ['d', 'b']]], ['c', ['a', ['b', 'd'], ['d', 'b']], ['d', 'ab']]]

Итак, насколько я вижу, это не проблема логики c, более того, я немного глуп, когда возвращаю свой код, потому что ожидаемый ответ - там, просто в кучу списков в списках. Я ожидаю ответа:

['abcd', 'acbd', 'acdb', 'cabd', 'cadb', 'cdab']

Если кто-то может указать где я действительно глупый / предлагаю лучший способ сделать это, я буду очень благодарен, потому что я начинаю чувствовать себя очень плохо из-за этого ха-ха.

1 Ответ

0 голосов
/ 19 марта 2020

Ответ, который вы даете в качестве ожидаемого ответа, больше похож на все возможные комбинации строк s и t, сохраняющие символы из s и t в результате в том порядке, в котором они находились в s и t.

Для достижения этого в простой функции генератора:

def combine(s, t):
    if not s:
        yield t
    elif not t:
        yield s
    else:
        for tail in combine(s[1:], t):
            yield s[0] + tail
        for tail in combine(s, t[1:]):
            yield t[0] + tail


print(list(combine('ab', 'cd')))

Результат:

['abcd', 'acbd', 'acdb', 'cabd', 'cadb', 'cdab']
...