Python 在字符列表中递归搜索字符串

Python 在字符列表中递归搜索字符串,python,recursion,Python,Recursion,我有一个问题需要解决,那就是递归地搜索列表中的字符串(字符串和列表的长度至少为2)并返回它的位置。例如:如果我们有ab和['a','b','c']列表,函数应该返回'(0,2),因为ab从索引0开始,在1结束(我们再添加一个) 如果我们的bc具有相同的列表,则函数应返回'(1,3) 如果我们的ac具有相同的列表,则函数应返回notfound 请注意,我正在解决一个更大的问题,即递归搜索字符矩阵中的字符串(从上到下,或仅从左到右出现),但我离解决方案还很远,所以我从搜索给定索引上矩阵行中的一个单

我有一个问题需要解决,那就是递归地搜索列表中的字符串(字符串和列表的长度至少为2)并返回它的位置。例如:如果我们有
ab
['a','b','c']
列表,函数应该返回
'(0,2)
,因为
ab
从索引
0
开始,在
1
结束(我们再添加一个)
如果我们的
bc
具有相同的列表,则函数应返回
'(1,3)

如果我们的
ac
具有相同的列表,则函数应返回
notfound


请注意,我正在解决一个更大的问题,即递归搜索字符矩阵中的字符串(从上到下,或仅从左到右出现),但我离解决方案还很远,所以我从搜索给定索引上矩阵行中的一个单词开始(就像搜索普通列表中的一个单词一样),因此,我的代码可能有
char\u mat[idx]
,将其视为一个普通列表,例如
['c','d','e']

请注意,我的代码中充满了bug,无法正常工作,因此我解释了我在代码中尝试做的事情。

我在这里尝试的想法是找到递归的基础(当列表的长度达到2时),有了这个小问题,我只需检查我的字在作为字符串连接在一起时是否等于字符,如果等于,则返回字符串的位置,否则返回未找到
然后对于递归步骤,我发送的列表没有第一个字符,并且我的开始索引+1,因此如果这个函数为我完成了所有工作(正如递归假设),我需要检查列表中的最后一个元素,以便我的递归工作。(但我真的不知道这是不是一种方法,因为最后一个索引可能不在单词中,所以我被卡住了)

现在我知道我犯了很多错误,而且我离正确答案还差得很远,我非常感谢您的任何解释或帮助,以了解如何解决这个问题,并继续我的更大问题,即在字符矩阵中查找字符串

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))
两种选择: 1.我们发现我们正在寻找的案例,因此我们列表的前两个元素是“ab”,或 2.“a”和“b”不是我们列表中的前两个元素。在不使用列表的第一个元素的情况下调用相同的函数,并增加indx_val,这样我们的结果将是正确的。当len(list)=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.我们发现我们正在寻找的案例,因此我们列表的前两个元素是“ab”,或 2.“a”和“b”不是我们列表中的前两个元素。在不使用列表的第一个元素的情况下调用相同的函数,并增加indx_val,这样我们的结果将是正确的。当len(list)=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))

我举了一个小例子,应该可以让你领先几步

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 = [['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))

开始和结束参数是什么意思?为什么要递归处理第一个问题?检查字符串是否在列表中可以不用recursion@bilke这是一个家庭作业,循环是不允许的,我觉得这是我进一步理解递归的机会,但我已经思考和尝试了大约两天,但没有一天实现。@Lukaschmid他们的意思是在哪里找到这个词,例如,如果我在搜索“hd”,在列表['a'、'b'、'h'、'd']中,我将得到start=2(h的索引),end=4(d的索引+1)。很抱歉,如果我不清楚,我翻译了它,并试图用我的话解释它。@Pwaol模式“ab”总是长度为2吗?开始和结束参数是什么意思?为什么要递归处理第一个问题?检查字符串是否在列表中可以不用recursion@bilke这是一个家庭作业,循环是不允许的,我觉得这是我进一步理解递归的机会,但我已经思考和尝试了大约两天,但没有一天实现。@Lukaschmid他们的意思是在哪里找到这个词,例如,如果我在搜索“hd”,在列表['a'、'b'、'h'、'd']中,我将得到start=2(h的索引),end=4(d的索引+1)。如果我不清楚,我很抱歉,我翻译了它,并试图用我的话解释它。@Pwaol模式“ab”总是长度为2吗?我非常感谢您的帮助。我有一个关于寻找递归基的问题,我还是一个初学者,我刚刚学会了我必须找到问题的最小版本,并在递归基中相应地返回,但我不知道为什么,我只是说最小的情况是当列表大小为2时,我返回(0,2),这使我的递归失败,你能解释一下我对递归基的看法吗?再次感谢您的帮助。@pAOL假设您想对列表进行排序。如果您将所有元素相互比较(n^2),这将非常昂贵。但如果将列表一分为二,再将两部分对半,直到只有长度的列表,则文本搜索会稍微复杂一些,因为文本可能与拆分部分重叠,因此会出现很多边缘情况。您的示例有点糟糕,因为递归通常意味着您将在函数中多次运行同一个函数。如果只调用一次,通常最好是迭代运行。看一看mergesort/quicksort谢谢你的解释,我觉得我现在对它有了更好的理解,我现在将尝试使用一个函数在列中搜索,与此想法相同(切片不起作用,所以我决定使用list(zip(*char_mat))访问我的列。在此之后,我将尝试构建一个递归函数,它将发送我的搜索函数所有列和行的索引。所以我完成了这个问题,你认为我可以编写代码这是解决问题的好方法吗?你认为我真的可以