Python 递归函数中的返回冲突
我正在写一个函数来解决这个问题。然而,我遇到了一个困境,即如何正确地从dfs递归函数中获取返回值。问题是:如果我在代码的最后一行中使用关键字Python 递归函数中的返回冲突,python,recursion,return,Python,Recursion,Return,我正在写一个函数来解决这个问题。然而,我遇到了一个困境,即如何正确地从dfs递归函数中获取返回值。问题是:如果我在代码的最后一行中使用关键字return,它会在[[0,1],[0,-1],[1,0],-1,0]]循环中提前结束。但是,如果删除最后一行中的return,递归函数将正常工作,但它永远不会从中返回True 如果len(word)==0:print(“TRUE”)返回TRUE语句,即使满足该语句。我基本上理解,一旦程序点击return,它将忽略它之后的所有代码。你能解释一下如何摆脱这个陷
return
,它会在[[0,1],[0,-1],[1,0],-1,0]]循环中提前结束。但是,如果删除最后一行中的return
,递归函数将正常工作,但它永远不会从中返回True
如果len(word)==0:print(“TRUE”)返回TRUE
语句,即使满足该语句。我基本上理解,一旦程序点击return
,它将忽略它之后的所有代码。你能解释一下如何摆脱这个陷阱吗
def dfs(cur, board, word):
board[cur[0]][cur[1]] = None
print(cur, board, word)
if len(word)==0:
print("TRUE")
return True
for direction in [[0,1],[0,-1],[1,0],[-1,0]]:
Doard = copy.deepcopy(board)
x = cur[0]+ direction[0]
y = cur[1]+ direction[1]
if x>len(board)-1 or x<0 or y>len(board[0])-1 or y<0:
continue
if Doard[x][y] == word[0]:
Doard[x][y] = None
return dfs([x,y], Doard, word[1:]) # Problematic RETURN keyword here
def dfs(电流、线路板、字):
线路板[cur[0]][cur[1]]=无
打印(电流、电路板、字)
如果len(word)==0:
打印(“真实”)
返回真值
对于[[0,1]、[0,-1]、[1,0]、-1,0]]中的方向:
Doard=复制。深度复制(板)
x=电流[0]+方向[0]
y=电流[1]+方向[1]
如果x>len(board)-1或xlen(board[0])-1或y@kszl给您的建议是好的,请检查递归调用的结果,仅当其True
时返回,否则让循环播放并在函数结束时返回False
您取消了只在电路板中找到单词
第一个字母的位置启动dfs()
搜索的函数,我重新创建了该函数。我在代码中看到的问题:你deepcopy()
董事会太早了,你的许多副本从未被使用过;您对x
和y
的使用令人困惑,如果没有颠倒,我会切换到下面的行
和列
;在dfs()
中的两个位置将字母替换为None
,但只能在一个位置执行此操作
我对您的代码进行的返工:
from copy import deepcopy
board = [
['A', 'B', 'C', 'E'],
['S', 'F', 'C', 'S'],
['A', 'D', 'E', 'E'],
]
def dfs(current, board, word):
if not word:
return True
current_row, current_column = current
rows, columns = len(board), len(board[0])
first, rest = word[0], word[1:]
for r, c in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
row = current_row + r
column = current_column + c
if not (0 <= row < rows and 0 <= column < columns):
continue
if board[row][column] == first:
clone = deepcopy(board)
clone[row][column] = None
if dfs((row, column), clone, rest):
return True
return False
def search_starting_letter(board, word):
rows, columns = len(board), len(board[0])
for row in range(rows):
for column in range(columns):
if board[row][column] == word[0]:
clone = deepcopy(board)
clone[row][column] = None
if dfs((row, column), clone, word[1:]):
return True
return False
word = "ABCCED"
print(search_starting_letter(board, word))
从复制导入deepcopy
董事会=[
[A',B',C',E'],
['S','F','C','S'],
[A',D',E',E'],
]
def dfs(当前、线路板、字):
如果不是文字:
返回真值
当前行,当前列=当前
行,列=len(线路板),len(线路板[0])
首先,rest=word[0],word[1:]
对于[(0,1),(0,-1),(1,0),(-1,0)]中的r,c:
行=当前行+r
列=当前列+c
如果不是(0)你应该使用条件返回。基本上,只要用if
将其包装。如果你找到了正确的解决方案,那么就返回True。否则,不要返回。这将允许for循环的其余迭代实际发生。非常感谢@cdlane。我不是CS专业的学生,但尝试进入该领域。感谢你指出inapp在我的原始代码中使用不当。通过知道我做错了什么,正确的答案就更清楚了。