我有兩段 python 代碼,我希望它們能給我相同的結果,但這并沒有發生。我為 leetcode 上的填充型別問題撰寫了以下例程并得到了錯誤的答案
def processIsland(self, grid: List[List[int]], proc: List[List[int]], i: int, j: int) -> bool:
n = len(grid)
m = len(grid[0])
proc[i][j] = 1
trav = [0, 1, 0, -1, 0]
val = True
for k in range(4):
ip = i trav[k]
jp = j trav[k 1]
if 0 <= ip < n and 0 <= jp < m:
if grid[ip][jp] == 0 and proc[ip][jp] == 0:
val = val and self.processIsland(grid, proc, ip, jp)
if i == 0 or i == n-1 or j == 0 or j == m-1:
return False
return val
但是,當我更改它時,將遞回呼叫函式回傳的布林值存盤在單獨的變數中并在最后采用 AND,我的解決方案被接受了。
def processIsland(self, grid: List[List[int]], proc: List[List[int]], i: int, j: int) -> bool:
n = len(grid)
m = len(grid[0])
proc[i][j] = 1
trav = [0, 1, 0, -1, 0]
val = [True, True, True, True]
for k in range(4):
ip = i trav[k]
jp = j trav[k 1]
if 0 <= ip < n and 0 <= jp < m:
if grid[ip][jp] == 0 and proc[ip][jp] == 0:
val[k] = self.processIsland(grid, proc, ip, jp)
if i == 0 or i == n-1 or j == 0 or j == m-1:
return False
val = val[0] and val[1] and val[2] and val[3]
return val
我很困惑,因為我認為他們應該有相同的行為。我是 Python 新手,所以我不知道我是否遺漏了任何明顯的東西。任何幫助表示贊賞。
uj5u.com熱心網友回復:
我不完全確定該函式應該計算什么,但請注意這and
是惰性的,即僅在“左”運算式尚未為假時才評估“右”運算式。在您的情況下,這意味著
val = val and self.processIsland(grid, proc, ip, jp)
val
如果不是False
來自較早的迭代,則只會執行遞回呼叫。并且由于這些遞回呼叫具有副作用(例如,它們修改grid
and proc
),這可能是一個問題。
另一方面,第二個版本總是執行所有四個遞回呼叫。如果你想讓它更漂亮一點,你可以這樣做,而不是在上一行中將return all(val)
它們結合起來。and
uj5u.com熱心網友回復:
理解邏輯運算子。
對于邏輯 AND:如果第一個運算子為 True,則僅檢查下一個運算子 Ex。
def hello():
print("Hello")
def world():
print("World")
a = True
b = False
c = a and hello()
c = b and world()
Output: Hello
Explanation:
a is true therefore hello() function is executed.
b is false therefore world() function is not executed.
因此,當val在第一種情況下為False時,您的代碼不會進行遞回呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/475127.html
上一篇:我的python函式回傳None,即使在宣告return陳述句之后也是如此。我無法理解我的腿在哪里。遞回是強制性的
下一篇:如何解決掃雷中的角落問題?