前提・実現したいこと
再帰関数を用いてLakeCounting問題(孤立した池を数え上げる)を作っていますが、再帰呼出し回数が上限に達した旨のエラーが出ていますが対処できません。
発生している問題・エラーメッセージ
エラーメッセージ Traceback (most recent call last): File "/home/xxx/PIPENV/AtCoder/code/Lake_counting.py", line 27, in dfs dfs(x, y) File "/home/xxx/PIPENV/AtCoder/code/Lake_counting.py", line 27, in dfs dfs(x, y) File "/home/xxx/PIPENV/AtCoder/code/Lake_counting.py", line 27, in dfs dfs(x, y) [Previous line repeated 995 more times] File "/home/xxx/PIPENV/AtCoder/code/Lake_counting.py", line 26, in dfs if (0 <= nx < col_size) and (0 <= ny < row_size) and LAKE[nx][ny] == 'w': RecursionError: maximum recursion depth exceeded in comparison Process finished with exit code 1
コード
python
1import sys 2 3sys.setrecursionlimit(5000) 4LAKE = [ 5 'wwwwwww.', 6 'wwww....', 7 '.......w'] 8# strをlistに変換する 9for i in range(len(LAKE)): 10 for k in range(len(LAKE[0])): 11 LAKE[i] = list(LAKE[i]) 12 13print(LAKE) 14 15row_size = len(LAKE) 16col_size = len(LAKE[0]) 17 18 19def dfs(x, y): 20 LAKE[x][y] = '.' 21 22 for dx in [-1, 1]: 23 for dy in [-1, 1]: 24 nx = x + dx 25 ny = y + dy 26 if (0 <= nx < col_size) and (0 <= ny < row_size) and LAKE[nx][ny] == 'w': 27 dfs(x, y) 28 29 30def solve(): 31 res = 0 32 for row in range(row_size): 33 for col in range(col_size): 34 LAKE[row][col] == 'w' 35 dfs(row, col) 36 res += 1 37 return res 38 39 40print(solve()) 41
試したこと
sys.setrecursionlimit(5000)
を実行し上限を上げましたが結果は変わりませんでした。
また、LAKEの文字列もかなり小さくしましたがエラーが出ています。
以下ご指摘のdfs(x,y)→dfs(nx,ny)などの修正を加えたコードです。
python
1import sys 2import logging 3 4logging.basicConfig(level=logging.CRITICAL) 5 6sys.setrecursionlimit(5000) 7LAKE = [ 8 'wwwwwww.', 9 'ww......', 10 '....w..w'] 11# strをlistに変換する 12for i in range(len(LAKE)): 13 LAKE[i] = list(LAKE[i]) 14 15logging.info(str(LAKE)) 16 17row_size = len(LAKE) 18col_size = len(LAKE[0]) 19 20 21def dfs(x, y): 22 LAKE[x][y] = '.' 23 24 for dx in [-1,0, 1]: 25 for dy in [-1,0, 1]: 26 nx = x + dx 27 ny = y + dy 28 if (0 <= nx < row_size) and (0 <= ny < col_size): 29 logging.info('nx:{},ny:{}'.format(nx, ny)) 30 31 if LAKE[nx][ny] == 'w': 32 dfs(nx, ny) 33 34 35def solve(): 36 res = 0 37 for row in range(row_size): 38 39 for col in range(col_size): 40 41 if LAKE[row][col] == 'w': 42 # 'w'の部分から再帰関数を開始する 43 dfs(row, col) 44 # 再帰関数が一段落したら++ 45 res += 1 46 return res 47 48 49print('lake :', solve()) 50
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー