procedure solve(liko_skaitmenu, rezultatas : integer);
var i, j : integer;
begin
if (not baigti) and (liko_skaitmenu = 0) and (rezultatas = b) then
begin
for j := 1 to c do
WriteLn(ats[j]);
baigti := true;
end
else
for i := 1 to N do
begin
ats[liko_skaitmenu] := i;
solve(liko_skaitmenu-1,rezultatas + a[i]);
end;
end;
所以我得到范围超限错误,我没有看到我真正超出范围。我试图用这个函数试图找到N长度数组中等于b的c元素之和。请帮帮我。
答案 0 :(得分:1)
if (not baigti) and (liko_skaitmenu = 0) and (rezultatas = b) then
当liko_skatimenu为0时,有可能评估为false,因为评估的结果也取决于rezultatas和baigti。如果下次你有 ats[-1] := i;
,那可能不是你想要的。我会把它改成像:
if (liko_skaitmenu = 0) or ((not baigti) and (rezultatas = b)) then
答案 1 :(得分:0)
代码使用了几个难以理解的全局变量,并且没有显示在调用过程之前如何初始化变量。如果代码示例是英文的,那也会有所帮助。
无论如何,
rezultatas > b
。if
上条件复杂,ats[liko_skaitmenu] := i;
可能会以liko_skaitmenu < 1
的值执行。你可能想要更像的东西:
if not baigti and (resultatas <= b) then (* if not told to stop, or off-range *)
begin
if liko_skaitemu = 0 then
begin
(* finished searching: either success or failure *)
if resultatas = b then
(*success! save the values *)
baigti := true;
end;
end
else
begin
(* continue searching *)
end
end;
那就是说,方法是O(N ^ c)。通过对数组进行排序并将递归步骤限制为可以保存答案的数组部分,您可以做得更好,或者您可以使用数组中c编号的组合。在这个论坛中有many个问题和好的答案。