정답은이 함수가 모든 정수에 대해 종료되지 않는다는 것입니다 (특히 -1에서 종료되지 않습니다). 친구는 이것이 의사 코드이며 의사 코드는 스택 오버플로에서 종료되지 않는다고 말한 것이 맞습니다. 의사 코드는 공식적으로 정의되어 있지 않지만 주석에서 말하는 것을 수행한다는 아이디어입니다. 코드에 "스택 오버플로 오류로 종료"라고 표시되지 않으면 스택 오버플로 오류가없는 것입니다.
이것이 실제 프로그래밍 언어 인 경우에도 스택 사용이 언어 정의의 일부가 아닌 한 정답은 여전히 "종료되지 않습니다"입니다. 대부분의 언어는 프로그램이 얼마나 많은 스택을 사용할지 정확하게 알기 어렵 기 때문에 스택을 오버플로 할 수있는 프로그램의 동작을 지정하지 않습니다.
실제 인터프리터 또는 컴파일러에서 코드를 실행하면 많은 언어에서 스택 오버플로가 발생하는 것이 언어의 형식적 의미와 구현 간의 불일치입니다. 언어의 구현은 유한 한 메모리를 가진 콘크리트 컴퓨터에서만 수행 될 수있는 것으로 일반적으로 이해된다. 프로그램이 스택 오버플로로 죽으면 더 큰 컴퓨터를 구입하고 필요한 경우 모든 메모리를 지원하기 위해 시스템을 다시 컴파일 한 다음 다시 시도해야합니다. 프로그램이 종료되지 않으면이 작업을 계속 수행해야 할 수 있습니다.
꼬리 호출 최적화 및 메모리 와 같은 일부 최적화 는 일정한 범위의 스택 공간에서 무한한 함수 호출 체인을 허용 할 수 있기 때문에 프로그램이 스택을 오버플로하거나 오버플로하지 않을 것이라는 사실조차 잘 정의되어 있지 않습니다 . 일부 언어 사양에서는 구현시 가능한 경우 테일 콜 최적화를 수행해야합니다 (기능 프로그래밍 언어에서 일반적 임). 이 기능을 위해, f(-1)
다음과 같이 확장 f(f(-2))
; 에 대한 외부 호출 f
은 테일 호출이므로 스택에 아무것도 밀어 넣지 않으므로 스택에만 f(-2)
들어가고을 반환 -1
하므로 스택은 처음과 동일한 상태로 돌아갑니다. 따라서 꼬리 호출 최적화 f(-1)
를 사용하면 일정한 메모리에서 영원히 반복됩니다.