2012-06-08 3 views
0

매우 느린 실행 때문에 반복 기능으로 변경해야하는 함수가 있습니다.
재귀 호출에는 두 가지 조건이 있습니다.반복에서 반복으로 변경

그건 이런 식으로 뭔가 :
(나는 함수 외부 클래스의 정적 배열을 가지고의 데이터를 가정 해 봅시다)

void func(int a, int b, int c, int d) { 
    //something 
    //non-recursive 
    //here.. 

    for (i=0; i<data.length; i++) { 
     if (!data[i].x) { 
      data[i].x = 1; 
      if (a == data[i].value1) 
       func(data[i].value2,b,c,d); 
      else if (a == data[i].value2) 
       func(data[i].value1,b,c,d); 

      data[i].x = 0; 
     } 
    } 
} 

!
편집 : 여기 내 알고리즘은 다음과 같습니다. 함수는 그래프에서 한 지점에서 다른 지점까지 모든 경로를 검색하지만 고유 한 꼭지점 만있는 경로 하나만 반환합니다 (배열로). !!

그리고 저는 그것을 관리하는 좋은 방법은 스택을 사용하는 것입니다 ...하지만 어떻게 해야할지 모르겠습니다. 누군가 나에게 그것에 대한 힌트를 줄 수 있을까요?

+2

FYI에서 재귀는 (호출) 스택을 사용합니다. Run recursion을 실행하면이 사이트의 이름이됩니다 ... 스택 오버플로 오류 – Bohemian

+1

이것이 재귀 메서드의 실제 구현입니까? 그렇지 않다면, 우리에게 보여주십시오, 왜냐하면 내가 여기서 본 것은 재귀의 모든 기본 원칙을 크게 위반하기 때문입니다. 즉, 재귀를 캐스 캐 이드하는 기본 경우는 없습니다. 'if (x == y) return z;'가 아니라면, 개별 반복은 데이터의 특정 하위 집합과 겹치는 부분을 처리하지 않습니다. 즉, 반복 할 때마다 'data'의 전체 길이를 반복 할 수 있습니다. –

+0

이 방법으로 무엇을하려고합니까? 일반적인 "반복 반복 변경"변경은 거의 동일한 실행 시간을가집니다. – amit

답변

0

함수가 여러번 똑같은 것을 계산할 가능성이 있습니다. 기술적 인 측면에서 overlapping sub-problems이라고합니다 (익숙한 사용자라면 dynamic programming). 먼저 그것이 사실인지 아닌지를 확인하십시오. 당신은 기능이 무엇인지에 대해서 아무 말도하지 않았기 때문에 정확한 문제를 말할 수 없습니다.

또한 stack을 사용하는 것에 대한 이야기는 재귀가 내부적으로 스택을 사용하기 때문에별로 유용하지 않습니다. 내부 스택 대신 외부 스택을 사용하면 에러가 발생하기 쉽지만 큰 용도는 아닙니다.

관련 문제