2013-08-16 5 views
0

C# asp.net 프로그램에서 재귀 함수를 사용하고 "StackOverflow Exception"을 throw합니다. 이 예외는 IIS에서 프로그램을 실행할 때 발생합니다.재귀 대 루프

재귀 함수 대신 루프를 사용하면 "StackOverflow Exception"이 발생합니까?

이 예외가 발생하면 루프 또는 재귀를 사용하는 것이 좋습니다.

편집 :

문제를 분석 한 후, 나는 재귀 수준이 1000 개 이상을하기 때문에 예외가 발생하고 오버 플로우 스택 원인이 발견했다.

이제는 여러 순환이 사용되므로 반복에 대한 순환 변환을 완전히 잃어 버렸습니다. I는 참조 용으로 여기에 샘플 코드를 게시하도록하겠습니다 :

RecursiveFunction(Node n) { 
    //Some Code for local variables 
node.processed=true; 
if(n.up){ 
    //Create a sub node for node below the current one 
    if(!subnode.processed) 
    RecursiveFunction(subnode); 
} 
else{ 
    //Create a sub node for node above current one 
if(!subnode.processed) 
    RecursiveFunction(subnode); 
} 
return result; 
} 

참고 : 위의 샘플 코드는 무한 루프에있을 수 있습니다 난 그냥 사용하는 여러 재귀를 언급하는 데 사용하기 때문에, 실제 구현은 무한 루프가 아닙니다.

이 경우 기본 조건은 노드가 이미 처리 된 경우 재귀를 사용하지 않고 직접 결과를 반환한다는 것입니다.

내 질문에, 여러 회귀가 사용되는 경우이를 반복으로 대체 할 수 있습니다. 내가 봤 거든 반복이나 재고와 재귀를 대체하기위한 많은 제안을 발견. 하지만 반복 반복으로 여러 재귀를 대체하는 방법에 대해서는 찾지 못했습니다. 당신은 루프로 전환 할 경우

예, 당신이 StackOverflowException을받지 않습니다 : 그것을 해결할 수 있는지를

+1

예, 일반적으로 코드를 게시 할 수 있습니다. – weston

+0

미안 해요, 코드를 게시 할 수 없습니다, 내 재귀 루프에 내 재귀 함수를 변환하는 경우에도 (StackOverflow 예외) 문제를 해결할 것입니다? – Anandaraj

+0

@Anandaraj possible – Grundy

답변

1

고유 한 스택을 관리하여 모든 재귀 함수를 비회원으로 변환 할 수 있습니다. 다음과 같이 입력하십시오.

void NonRecursiveFunction(Node n) { 
    var stack = new Stack<Node>(); 
    stack.Push(n); 

    while(stack.Any()) { 
     node = stack.Pop(); 
     //Some Code for local variables 
     node.processed=true; 
     if(n.up){ 
      //Create a sub node for node below the current one 
      if(!subnode.processed) 
       stack.Push(subnode); 
     } else{ 
      //Create a sub node for node above current one 
      if(!subnode.processed) 
       stack.Push(subnode); 
     } 
    } 
    return result; 
} 
+0

빠른 답장을 보내 주셔서 감사합니다. 나는 너의 제안을 시도 할 것이다. – Anandaraj

1

이 좋아, 그래서 당신은 알고 싶어요.

메서드를 호출하면 호출 스택으로 푸시됩니다. 내부에서 동일한 메소드를 호출하면 더 크고 더 큰 스택이 빌드됩니다. 결국 프로그램에서 스택의 사용 가능한 모든 메모리를 모두 사용하면 StackOverflowException이 나타납니다.

루프에서는 스택에 점점 더 많은 것을 밀어 넣지 않으므로이 문제가 발생하지 않습니다. 그러나 구현하기가 덜 간단 할 수도 있고 그렇지 않으면 재귀를 사용하지 않을 수도 있습니다.

다른 사람이 언급했듯이이 경우 재귀를 사용하면 아무런 문제가 없을 수도 있습니다.이 경우 재귀를 멈추지 않을 것입니다. 어떤 경우에는 같은 버전의 루프가 영원히 계속 될 것입니다. 그러나 스택 오버 플로우를 얻지는 못할 것입니다.

+0

답변 해 주셔서 감사합니다. – Anandaraj