如何在递归中处理计数
How to handle count in recursion
import unittest
def riverSizes(test_input):
l=[]
river_sizes = 0
for i in range(len(test_input)):
for j in range(len(test_input[i])):
if test_input[i][j] == 1:
count = traverse_river(i, j, len(test_input), len(test_input[0]), test_input, 0)
l.append(count)
river_sizes += 1
print(river_sizes,l)
def traverse_river(x, y, max_row, max_col, matrix, count):
if x < 0 or x >= max_row or y < 0 or y >= max_col or matrix[x][y] != 1:
return count
matrix[x][y] = 2
traverse_river(x - 1, y, max_row, max_col, matrix, count + 1)
traverse_river(x + 1, y, max_row, max_col, matrix, count + 1)
traverse_river(x, y + 1, max_row, max_col, matrix, count + 1)
class TestProgram(unittest.TestCase):
def test_case_1(self):
test_input = [[1, 0, 0, 1, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 0, 1, 1, 0]]
expected = [1, 2, 2, 2, 5]
riverSizes(test_input)
self.assertEqual(sorted(riverSizes(test_input)), expected)
我正在尝试 运行 矩阵上的 dfs 并跟踪所有带有“1”的连接组件以及连接组件的长度计数。如何处理 recusrrsion
中的计数
代码的一些问题:
函数 riverSizes
没有 return 任何东西,因此对其应用 sorted
也无济于事。
递归也要考虑y - 1
,因为有可能是U型,像这样的模式:
1 0 1
1 1 1
...而且您不想错过右上角的 1。
函数 traverse_river
并不总是 return 计数 -- 仅当第一个 if
条件为真时。
此外,您不需要:
- 将
count
作为参数传递。只需添加 returned 计数即可累积该值。
- 维护
river_sizes
,因为这是重复信息:它实际上等于len(l)
。
这是它的工作原理:
def riverSizes(test_input):
l = []
for i in range(len(test_input)):
for j in range(len(test_input[i])):
if test_input[i][j] == 1:
count = traverse_river(i, j, len(test_input), len(test_input[0]), test_input)
l.append(count)
return l
def traverse_river(x, y, max_row, max_col, matrix):
if x < 0 or x >= max_row or y < 0 or y >= max_col or matrix[x][y] != 1:
return 0
matrix[x][y] = 2
return (1 + traverse_river(x - 1, y, max_row, max_col, matrix)
+ traverse_river(x + 1, y, max_row, max_col, matrix)
+ traverse_river(x, y + 1, max_row, max_col, matrix)
+ traverse_river(x, y - 1, max_row, max_col, matrix))
test_input = [[1, 0, 0, 1, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 0, 1, 1, 0]]
print(riverSizes(test_input))
import unittest
def riverSizes(test_input):
l=[]
river_sizes = 0
for i in range(len(test_input)):
for j in range(len(test_input[i])):
if test_input[i][j] == 1:
count = traverse_river(i, j, len(test_input), len(test_input[0]), test_input, 0)
l.append(count)
river_sizes += 1
print(river_sizes,l)
def traverse_river(x, y, max_row, max_col, matrix, count):
if x < 0 or x >= max_row or y < 0 or y >= max_col or matrix[x][y] != 1:
return count
matrix[x][y] = 2
traverse_river(x - 1, y, max_row, max_col, matrix, count + 1)
traverse_river(x + 1, y, max_row, max_col, matrix, count + 1)
traverse_river(x, y + 1, max_row, max_col, matrix, count + 1)
class TestProgram(unittest.TestCase):
def test_case_1(self):
test_input = [[1, 0, 0, 1, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 0, 1, 1, 0]]
expected = [1, 2, 2, 2, 5]
riverSizes(test_input)
self.assertEqual(sorted(riverSizes(test_input)), expected)
我正在尝试 运行 矩阵上的 dfs 并跟踪所有带有“1”的连接组件以及连接组件的长度计数。如何处理 recusrrsion
中的计数代码的一些问题:
函数
riverSizes
没有 return 任何东西,因此对其应用sorted
也无济于事。递归也要考虑
y - 1
,因为有可能是U型,像这样的模式:1 0 1 1 1 1
...而且您不想错过右上角的 1。
函数
traverse_river
并不总是 return 计数 -- 仅当第一个if
条件为真时。
此外,您不需要:
- 将
count
作为参数传递。只需添加 returned 计数即可累积该值。 - 维护
river_sizes
,因为这是重复信息:它实际上等于len(l)
。
这是它的工作原理:
def riverSizes(test_input):
l = []
for i in range(len(test_input)):
for j in range(len(test_input[i])):
if test_input[i][j] == 1:
count = traverse_river(i, j, len(test_input), len(test_input[0]), test_input)
l.append(count)
return l
def traverse_river(x, y, max_row, max_col, matrix):
if x < 0 or x >= max_row or y < 0 or y >= max_col or matrix[x][y] != 1:
return 0
matrix[x][y] = 2
return (1 + traverse_river(x - 1, y, max_row, max_col, matrix)
+ traverse_river(x + 1, y, max_row, max_col, matrix)
+ traverse_river(x, y + 1, max_row, max_col, matrix)
+ traverse_river(x, y - 1, max_row, max_col, matrix))
test_input = [[1, 0, 0, 1, 0], [1, 0, 1, 0, 0], [0, 0, 1, 0, 1], [1, 0, 1, 0, 1], [1, 0, 1, 1, 0]]
print(riverSizes(test_input))