2013-10-23 4 views
0

모든 재귀는 스택 구조를 가진 반복 함수로 수정 ​​될 수 있습니다. 그렇다면 왜 그렇게하고 싶습니까? 대답은 stackoverflow를 피하기위한 것이고, 컴퓨터가 재귀를 통해 어떻게 오버플로 될 수 있습니까? 왜 컴파일러가 자동으로 힙의 스택에 재귀 함수를 자동으로 추가합니까? 아니면 추가 키워드를 사용합니까? 나는 또한 힙이 제한적이라는 것을 알고 있지만, 프로그램에 할당 된 스택보다 훨씬 큽니다.재귀에 의한 stackoverflow를 해결할 수없는 이유는 무엇입니까?

+3

힙도 무한하지 않습니다 ... –

+2

[꼬리 재귀 함수] (http://stackoverflow.com/questions/33923/what-is-tail-recursion/33928#33928)는 다음과 같이 다시 쓸 수 있습니다. 반복 함수이지만 많은 재귀 함수는 꼬리 재귀가 아닙니다. – Simon

+0

모든 프로세스는 운영 체제 데이터 구조에 2GB가 할당 된 32 비트 컴퓨터에서 4GB의 가상 메모리를 확보했습니다. 따라서 스택의 크기가 제한되어 오버플로가 발생할 수 있습니다. –

답변

0

활성화 레코드는 실제로 힙 할당이 가능하지만 일반적으로 너무 비싸다고 생각됩니다. 그럼에도 불구하고 스택 방식의 Python과 SML/NJ와 같은 몇 가지 구현 방법이 있습니다.

이러한 경우 동기 부여는 스택 오버플로를 "수정"하지 않고 지속성 구현을 돕는 것일 수 있습니다.

0

C/C++ maximum stack size of programMSDN에 따르면 Windows에서 최대 스택 크기는 1 MiB입니다. 귀하의 질문은 흥미 롭습니다. 키워드는 확실히 가능할 것이고 컴파일러는 그것을 할 수있을 것입니다. 당신은 컴파일러 제작자에게 그것에 대해 물어볼 필요가 있습니다. 그러나 그것은 매우 흥미로운 특징은 아닙니다.

힙의 스택 및 재귀 장부 변수에 다른 로컬 변수가 있으므로 캐싱이 어려울 수 있습니다. 정보는 메모리에 흩어져 있습니다.

일부 재귀 알고리즘은 실제로는 반복적 인 알고리즘 (예 : Factorial) 또는 닫힌 형식의 표현식 (예 : Fibonacci numbers 참조)으로 바뀔 수 있습니다. 그러면 재귀 호출의 장부 보관은 필요 없습니다.

+0

DEFAULT 최대 스택은 1입니다. (그리고 VS! = windows) –

0

반복 프로세스에서는 재귀 상태를 직접 추적합니다.

매우 효율적인 절차를 통해 컴파일러가 매우 일반적인 절차 메커니즘 (효율이 모든 종류의 ABI 관심사로 인해 방해받을 수 있음)을 사용하는 것이 가능할 수 있습니다.

모든 시스템이 고정 스택 또는 선형 주소 공간을 사용하지 않기 때문에 모든 시스템에서 스택 검사가 가능하지만 쉽지는 않습니다. 또한 각 재귀에 검사가 추가되므로 오버 헤드가 있습니다.

관련 문제