帕斯卡范围超限

时间:2011-01-26 18:30:22

标签: recursion pascal freepascal

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元素之和。请帮帮我。

2 个答案:

答案 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)

代码使用了几个难以理解的全局变量,并且没有显示在调用过程之前如何初始化变量。如果代码示例是英文的,那也会有所帮助。

无论如何,

  1. 该代码无法防范rezultatas > b
  2. 的可能性
  3. 由于if上条件复杂,ats[liko_skaitmenu] := i;可能会以liko_skaitmenu < 1的值执行。
  4. 代码不会防止重复相同的数字/索引位置。
  5. 你可能想要更像的东西:

    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个问题和好的答案。