2013-02-02 4 views
6

나는 재귀에 대해 공부하고 있었고, 난이 질문에 건너 온 : 나는 대답 (A)언어가 재귀를 지원해야하는 속성은 무엇입니까?

하지만 프로그래밍 언어가해야 모든 기능을 알고 싶은 것을 발견

FORTRAN implementations do not permit recursion because 

a. they use static allocation for variables 

b. they use dynamic allocation for variables 

c. stacks are not available on all machines 

d. it is not possible to implement recursion on all machines. 

재귀를 지원하십시오.

누군가는 사전에 내 의심 함수 나 (그것의 반환 주소를 포함) 서브 루틴

+0

scicomp에 오신 것을 환영합니다. 질문에 감사드립니다. 디어 헌터 (Deer Hunter)의 말에 따르면 우리는이 커뮤니티에 많은 Fortran 사용자가 있지만 일반적으로 이와 같은 일반적인 프로그래밍 관련 질문은 처리하지 않습니다. StackOverflow로 옮겨 가겠습니다. –

+0

알았어. 이동을위한 감사합니다 –

+2

당신이 필요로하는 유일한 것은 다음과 같습니다 : 함수와 지역 변수 및 함수 호출 당 인수 저장 공간. 포인트 a. 귀하의 질문에 저장 공간이 함수 호출을 통해 재사용 될 것을 제안하는 것 같습니다. – jackrabbit

답변

4

지역 변수를

감사를 해결하시기 바랍니다 수가 호출 될 때마다 새로운 사본이어야한다.

일반적으로 스택 아키텍처를 사용하여 수행됩니다. 함수가 호출 될 때마다 인수가 스택에 푸시되고 반환 주소가 푸시 된 다음 메모리 블록이 "푸시"됩니다 (스택 포인터를 충분한 양만큼 감소 시킴). 특수 레지스터 인 "프레임 포인터"가 해당 메모리를 가리 키도록 설정되고 함수는 해당 레지스터를 참조하여 모든 로컬 변수를 참조합니다.

다른 언어는 물리적 하드웨어 스택을 사용하지 않지만 논리 목록은 연결된 목록으로 구현되지만 원칙은 동일합니다.

원래 Fortrans에는이 개념이 없으므로 모든 변수가 고정 된 전역 위치에 저장되었으므로 재귀 호출이 중단되거나 중지됩니다. 예를 들어, A가 B를 호출하면 B가 C 호출을 호출하면 B는 C로 돌아가고 B는 B로 돌아갑니다. B는 하나의 반환 주소 만 기억할 수 있기 때문에 C에 무한대로 돌아갑니다.

calls: A -> B -> C -> B 

returns:  B <- C <- B 
      B -> C 

또한 B에 대한 두 번째 호출이 발생할 때 B에 대한 첫 번째 호출의 모든 로컬 변수와 인수가 마비됩니다.

1

질문자가 묻는 객관식 질문은 오해의 소지가있는 질문입니다. 언어의 가장 오래된 버전에는 재귀 지원이 없지만 재귀를 허용하는 최신 버전의 FORTRAN 언어가 있기 때문입니다.

언어 구현이 재귀를 지원하는지 여부는 언어의 언어가 기능을 정의하고 구현의 준수 정도를 결정하는 방식으로 고려되어야합니다.

관련 문제