Pascal 中的回溯:寻找最大加权分支
Backtracking in Pascal: finding maximal weighted branch
我已经学习 Pascal(使用 Free Pascal 编译器)一周了,遇到了一个看似简单的练习。给定如下所示的结构,找到最大加权分支:
1
4 9
7 0 2
4 8 6 3
分支是任何数字序列,从顶部开始(在本例中为:1),对于每个数字,分支都可以向左下或右下扩展。例如,分支 1-4-0 可以扩展为 1-4-0-8 或 1-4-0-6。所有分支必须从顶部开始到底部结束。
在这个例子中,最大分支是1-4-7-8,这给了我们20。为了解决这个问题,我尝试使用回溯。三角形结构存储在 'triangle':
类型的数组中
type triangle = array[1..MAX_NUM_OF_ROWS, 1..MAX_NUM_OF_ROWS] of integer;
这是我的实现:
function findAux(data: triangle; dim: integer; i: integer; j:integer) : integer;
begin
if i = dim then
findAux := data[i][j]
else
if findAux(data, dim, i + 1, j + 1) > findAux(data, dim, i + 1, j) then
findAux := data[i+1][j+1] + findAux(data, dim, i + 1, j + 1);
else
findAux := data[i+1][j] + findAux(data, dim, i + 1, j);
end;
function find_heaviest_path(data: triangle; dim: integer) : integer;
begin
find_heaviest_path := findAux(data, dim, 1, 1);
end;
如您所见,我使用了一个辅助功能。不幸的是,它似乎没有给出正确的结果。对于上面看到的结构,我得到的结果是 27,减了 7 分。我错过了什么?整体实施情况如何?我应该补充一点,对于这个练习,最大行数是 100。如果需要说明,请随时询问。
您的 findAux
将错误的值添加到递归获得的结果中。另外,您可以使用一些局部变量稍微整理一下代码。 findAux
的更正版本:
uses math;
...
function findAux(data: triangle; dim: integer; i: integer; j:integer) : integer;
var
left, right: integer;
begin
if i = dim then
findAux := data[i][j]
else begin
left := findAux(data, dim, i + 1, j);
right := findAux(data, dim, i + 1, j + 1);
findAux := data[i][j] + Max(left, right);
end;
end;
我已经学习 Pascal(使用 Free Pascal 编译器)一周了,遇到了一个看似简单的练习。给定如下所示的结构,找到最大加权分支:
1
4 9
7 0 2
4 8 6 3
分支是任何数字序列,从顶部开始(在本例中为:1),对于每个数字,分支都可以向左下或右下扩展。例如,分支 1-4-0 可以扩展为 1-4-0-8 或 1-4-0-6。所有分支必须从顶部开始到底部结束。
在这个例子中,最大分支是1-4-7-8,这给了我们20。为了解决这个问题,我尝试使用回溯。三角形结构存储在 'triangle':
类型的数组中type triangle = array[1..MAX_NUM_OF_ROWS, 1..MAX_NUM_OF_ROWS] of integer;
这是我的实现:
function findAux(data: triangle; dim: integer; i: integer; j:integer) : integer;
begin
if i = dim then
findAux := data[i][j]
else
if findAux(data, dim, i + 1, j + 1) > findAux(data, dim, i + 1, j) then
findAux := data[i+1][j+1] + findAux(data, dim, i + 1, j + 1);
else
findAux := data[i+1][j] + findAux(data, dim, i + 1, j);
end;
function find_heaviest_path(data: triangle; dim: integer) : integer;
begin
find_heaviest_path := findAux(data, dim, 1, 1);
end;
如您所见,我使用了一个辅助功能。不幸的是,它似乎没有给出正确的结果。对于上面看到的结构,我得到的结果是 27,减了 7 分。我错过了什么?整体实施情况如何?我应该补充一点,对于这个练习,最大行数是 100。如果需要说明,请随时询问。
您的 findAux
将错误的值添加到递归获得的结果中。另外,您可以使用一些局部变量稍微整理一下代码。 findAux
的更正版本:
uses math;
...
function findAux(data: triangle; dim: integer; i: integer; j:integer) : integer;
var
left, right: integer;
begin
if i = dim then
findAux := data[i][j]
else begin
left := findAux(data, dim, i + 1, j);
right := findAux(data, dim, i + 1, j + 1);
findAux := data[i][j] + Max(left, right);
end;
end;