2011-01-26 5 views
0
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 요소의 합을 찾으려고합니다. 도와주세요. 평가의 결과가 너무 rezultatas 및 baigti에 의존하기 때문에 liko_skatimenu이 0 일 때이 false로 평가 가능성이있다파스칼 범위 오버런

답변

1
if (not baigti) and (liko_skaitmenu = 0) and (rezultatas = b) then 

. 다음에 진행하면 ats[-1] := i;이 표시됩니다. 이는 아마도 원하는 내용이 아닙니다. 어려운 이해할 수 있도록 몇 가지 글로벌 변수를 사용

if (liko_skaitmenu = 0) or ((not baigti) and (rezultatas = b)) then 
0

코드, 당신은 프로 시저가 호출되기 전에 변수를 초기화하는 방법을 표시하지 않습니다 : 내가 좋아하는 무언가로 변경 것입니다. 또한 코드 샘플이 영어로 작성된 경우 도움이됩니다.

어떤 방법,

  1. 코드는 rezultatas > b의 가능성을 방지하지 않습니다.
  2. if의 복잡한 조건으로 인해 ats[liko_skaitmenu] := i;liko_skaitmenu < 1의 값으로 실행될 수 있습니다.
  3. 코드는 동일한 숫자/색인 위치 반복을 방지하지 않습니다. 의 접근 방식은 O (N^C) 말했다

    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; 
    

    :

당신은 아마 같은 것을 원한다. 배열을 정렬하고 재귀 단계를 응답을 보유 할 수있는 배열 부분으로 제한하거나 배열의 c 번호 조합을 사용하여 작업을 수행하는 것보다 더 잘 수행 할 수 있습니다. 이 포럼에는 좋은 답변이있는 many 개의 질문이 있습니다.

관련 문제