У меня есть проблема, которую нужно решить: рекурсивный поиск строки в списке (длина строки и списка не менее 2) и возврат ее позиций. например: если бы у нас был ab со списком ['a','b','c'], функция должна вернуть '(0,2)', поскольку ab начинается с индекса 0 и заканчивается в {{X5 }} (добавляем еще один).
если бы у нас был bc с тем же списком, функция должна вернуть '(1,3)'.
если бы у нас был ac с тем же списком, функция должна вернуть not found.

Обратите внимание, что я решаю более серьезную проблему, заключающуюся в рекурсивном поиске строки в матрице символов (которая появляется сверху вниз или только слева направо), но я еще далек от решения, поэтому я начинаю путем поиска слова в строке матрицы по заданному индексу (как для поиска слова в обычном списке), поэтому мой код может иметь char_mat[idx], рассматривать его как обычный список, например {{X11} } например.
Обратите внимание, что в моем коде полно ошибок и он не работает, поэтому я объяснил, что я пытался сделать с его помощью.

def search_at_idx(search_word, char_mat, idx, start, end):
if len(char_mat[idx]) == 2:
    if ''.join(char_mat[idx]) == search_word:
        return 0,2
    else:
        return 'not found', 'not found'
start, end = search_at_idx(search_word, char_mat[idx][1:], idx, start+1, end)
return start, end 

Идея того, что я пытался здесь сделать, - найти основу рекурсии (когда длина списка достигает 2), и с этой небольшой проблемой я просто проверяю, равно ли мое слово символам, когда они объединены в строку , и вернуть позицию строки, если она равна else return not found
Затем для этапа рекурсии я отправляю список без первого символа и моего начального индекса +1, поэтому, если эта функция выполняет всю работу за меня (как гипотеза рекурсии), мне нужно проверить последний элемент в списке, поэтому моя рекурсия работает. (но я не знаю, действительно ли это способ сделать это, поскольку последний индекс может быть не в слове, поэтому я застрял).

Теперь я знаю, что сделал много ошибок, и я далек от правильного ответа. Я был бы очень признателен за любое объяснение или помощь, чтобы понять, как решить эту проблему, и перейти к моему большему проблема, заключающаяся в поиске строки в матрице символов.

0
Pwaol 21 Янв 2021 в 12:58

2 ответа

Лучший ответ

Я собрал небольшой пример, который поможет вам сделать несколько шагов вперед.

char_mat = [['c', 'e', 'l', 'k', 'v'],]
search_word = 'lk'

def search_at_idx(search_word, char_mat, idx, start=0):
    if len(char_mat[idx]) < len(search_word):
        return 'not', 'found'
    if ''.join(char_mat[idx][:len(search_word)]) == search_word:
        return start, start+len(search_word)
    char_mat[idx] = char_mat[idx][1:]
    start, end = search_at_idx(search_word, char_mat, idx, start+1)
    return start, end 

print(search_at_idx(search_word, char_mat, 0))

Чтобы указать на несколько ваших ошибок:

  • В своей рекурсии вы используете char_mat[idx][1:]. Это передаст часть списка, а не модифицированную матрицу. Это означает, что ваш следующий вызов char_mat[idx] проверит букву по этому индексу в массиве. Я рекомендую использовать отладчик и пройти через программу, чтобы проверить содержимое ваших переменных.

  • Вместо использования начала и конца вы всегда можете предположить, что найденное слово имеет ту же длину, что и слово, которое вы ищете. Таким образом, расстояние, на которое вы должны смотреть, всегда равно start + len(search_word)

Если у вас есть дополнительные вопросы по моему коду, прокомментируйте.

Вот пример понимания списка, если это считается дырой loop:

foundword = list(map("".join, list(zip(*([char_mat[idx][i:] + list(char_mat[idx][i-1]) for i in range(len(search_word))])))[:-1])).index(search_word)
print((foundword, foundword + len(search_word)) if foundword else 'Not found')
1
Lukas Schmid 21 Янв 2021 в 10:44
l = ["a","b","c"]


def my_indexes(pattern, look_list, indx_val):
    if pattern == "".join(look_list)[:2]:
        return indx_val, indx_val+1
    else:
        if len(look_list) == 2:
            return None
        return my_indexes(pattern, look_list[1:],indx_val+1)

print(my_indexes("bc",l,0))

Два варианта: мы находим дело, которое ищем, поэтому первыми элементами нашего списка являются «ab», или мы их не находим. Если мы их не находим, давайте вызовем ту же функцию без первого элемента списка и увеличим indx_val, чтобы наш результат был правильным, если мы найдем совпадение. Мы прекращаем это делать, когда размер списка равен 2 и мы не нашли случая. (при условии, что мы ищем длину в 2 символа)

РЕДАКТИРОВАТЬ: для любой длины

l = ["a","b","c","d"]


def my_indexes(pattern, look_list, indx_val):
    if pattern == "".join(look_list)[:len(pattern)]:
        return indx_val, indx_val+len(pattern) # -1 to match correct indexes
    else:
        if len(look_list) == len(pattern):
            return None
        return my_indexes(pattern, look_list[1:],indx_val+1)

print(my_indexes("cd",l,0))
1
bilke 21 Янв 2021 в 10:26
65824993