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)