Пересечение диапазона Паскаля - PullRequest
0 голосов
/ 26 января 2011
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;

Итак, я получаю ошибку переполнения диапазона, и я не вижу, где я действительно вышел за пределы диапазона.То, что я пытаюсь сделать с этой функцией, это попытаться найти сумму элементов c в массиве длиной N, равную b.Пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 26 января 2011
if (not baigti) and (liko_skaitmenu = 0) and (rezultatas = b) then

Существует вероятность того, что это оценивается как ложное, когда liko_skatimenu равно 0, потому что результат оценки зависит также от результатов и байгти.Если это произойдет в следующий раз, у вас будет ats[-1] := i;, что, вероятно, не то, что вы хотели.Я бы изменил это на что-то вроде:

if (liko_skaitmenu = 0) or ((not baigti) and (rezultatas = b)) then
0 голосов
/ 26 января 2011

В кодах используется несколько глобальных переменных, которые затрудняют понимание, и вы не показываете, как переменные инициализируются до вызова процедуры. Также было бы полезно, если бы пример кода был на английском языке.

В любом случае,

  1. Код не защищает от возможности rezultatas > b.
  2. Из-за сложного условия на if, ats[liko_skaitmenu] := i; может выполняться со значениями liko_skaitmenu < 1.
  3. Код не защищает от повторения того же номера / индексной позиции.

Вы, вероятно, хотите что-то вроде:

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 в массиве. На этом форуме есть много похожих вопросов с хорошими ответами.

...