Python 递归函数返回“None”而不是请求的列表

Python 递归函数返回“None”而不是请求的列表,python,recursion,return,nonetype,Python,Recursion,Return,Nonetype,我需要在矩阵中找到给定字符串的所有匹配项,并返回每个匹配项的字母所在的位置。这些输入的格式示例如下: soup = ["LAMXB","AOEYF","FCHTB","GFKAR","POSFD"] text = "HOLA" 其中,文本是字符串,soup是字母矩阵 为此,我有以下代码: def valid_move(x, y, path, cant_row, cant_co

我需要在矩阵中找到给定字符串的所有匹配项,并返回每个匹配项的字母所在的位置。这些输入的格式示例如下:

soup = ["LAMXB","AOEYF","FCHTB","GFKAR","POSFD"]
text = "HOLA"
其中,文本是字符串,soup是字母矩阵

为此,我有以下代码:

def valid_move(x, y, path, cant_row, cant_col):
    if (0<=x<=cant_row-1) and (0<=y<=cant_col-1) and ((x,y) not in path):
        return True
    else:
        return False

def busqueda(soup, text, row, col, path, index):
    soluciones = []
    cant_row = len(soup)
    cant_col = len(soup[0])

    if soup[row][col] != text[]:
        return

    if indice == len(text)-1:
        for pos_index in range(0,len(path)):
            soluciones.append(path[pos_index])
        soluciones.append((row,col))
        return soluciones

    path.append((row,col))

    for move in range(8):
        if valid_move(row+next_row[move],col+next_col[move],path,cant_row,cant_col):
            return busqueda(soup,text,row+next_row[move],col+next_col[move],path,index+1)

    path.pop()

def encontrar_ocurrencias(soup,text):
    cant_row = len(soup)
    cant_col = len(soup[0])

    next_row = [-1,-1,-1,0,0,1,1,1]
    next_col = [-1,0,1,-1,1,-1,0,1]
    path = []
    for i in range(0,cant_row):
        for j in range(0,cant_col):
            busqueda(soup,text,i,j,path,0)
如果我使用printsoluciones而不是return soluciones,我会得到上面的列表,这样代码就可以运行了,但是如果我使用return,我就什么也得不到

我已经阅读了本页中提出的类似问题,但我仍然找不到答案。我知道每次调用递归函数时都必须使用return,但我仍然看不出我犯的错误在哪里


提前感谢您的帮助

您的代码中有一些拼写错误,下一行和下一列都需要在更高的级别上提供-它们在需要的地方不为人所知

递归求解的一个重要的传递方法是在解的点上进行屈服。这是一个生成器函数,因此如果这是所需的输出形式,则需要明确列出:

next_row = [-1,-1,-1,0,0,1,1,1]
next_col = [-1,0,1,-1,1,-1,0,1]

def valid_move(x, y, path, cant_row, cant_col):
    return (x in range(cant_row)
            and y in range(cant_col)
            and (x,y) not in path )

def busqueda(soup, text, row, col, path, index):
    cant_row = len(soup)
    cant_col = len(soup[0])

    if soup[row][col] != text[index]:
        return

    path.append((row,col))
    if index == len(text)-1:
        yield (path.copy())
    else:
        for drow, dcol in zip(next_row,next_col):
            if valid_move(row+drow,col+dcol,path,cant_row,cant_col):
                yield from busqueda(soup,text,row+drow,col+dcol,path,index+1)
    path.pop()

def encontrar_ocurrencias(soup,text):
    cant_row = len(soup)
    cant_col = len(soup[0])

    path = []
    for i in range(0,cant_row):
        for j in range(0,cant_col):
            yield from busqueda(soup,text,i,j,path,0)

soup = ["LAMXB","AOEYF","FCHTB","GFKAR","POSFD"]
text = "HOLA"
result = list( encontrar_ocurrencias(soup,text) )
print(result)

当从递归函数返回时,所有路径都需要将结果返回回调用堆栈。如果在递归完成的过程中遇到了裸返回,那么在此之前找到的任何结果都将丢失。
next_row = [-1,-1,-1,0,0,1,1,1]
next_col = [-1,0,1,-1,1,-1,0,1]

def valid_move(x, y, path, cant_row, cant_col):
    return (x in range(cant_row)
            and y in range(cant_col)
            and (x,y) not in path )

def busqueda(soup, text, row, col, path, index):
    cant_row = len(soup)
    cant_col = len(soup[0])

    if soup[row][col] != text[index]:
        return

    path.append((row,col))
    if index == len(text)-1:
        yield (path.copy())
    else:
        for drow, dcol in zip(next_row,next_col):
            if valid_move(row+drow,col+dcol,path,cant_row,cant_col):
                yield from busqueda(soup,text,row+drow,col+dcol,path,index+1)
    path.pop()

def encontrar_ocurrencias(soup,text):
    cant_row = len(soup)
    cant_col = len(soup[0])

    path = []
    for i in range(0,cant_row):
        for j in range(0,cant_col):
            yield from busqueda(soup,text,i,j,path,0)

soup = ["LAMXB","AOEYF","FCHTB","GFKAR","POSFD"]
text = "HOLA"
result = list( encontrar_ocurrencias(soup,text) )
print(result)