24.07.2013 Views

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>8.</strong>2.14 Recursividade e rotinas recursivas<br />

<strong>Capítulo</strong> <strong>8.</strong> Sub-Programas e Módulos 103<br />

Recursividade ocorre quando rotinas chamam a si mesma, seja de forma direta ou indireta. Por exemplo,<br />

sejam as rotinas A e B. Recursividade pode ocorrer de duas formas:<br />

Recursividade direta: A invoca A diretamente.<br />

Recursividade indireta: A invoca B, a qual invoca A.<br />

Qualquer cadeia de invocações de rotinas com um componente circular (isto é, invocação direta ou indireta)<br />

exibe recursividade. Embora recursividade seja uma técnica bonita e sucinta para implementar uma grande<br />

variedade de problemas, o uso incorreto da mesma pode provocar uma perda na eficiência da computação do<br />

código.<br />

Fortran 77<br />

Em Fortran 77, recursividade direta não é permitida. Qualquer tentativa de forçar uma rotina a chamar a<br />

si própria resultará em erro de compilação. Em grande parte dos textos, afirma-se que recursividade indireta<br />

também não é possível 3 . Contudo, recursividade pode ser simulada em Fortran 77 quando uma rotina chama a<br />

si própria usando não o seu nome real mas através de um argumento mudo, como no exemplo abaixo: 4<br />

PROGRAM MAIN<br />

INTEGER N, X<br />

EXTERNAL SUB1<br />

COMMON /GLOBALS/ N<br />

X= 0<br />

PRINT*, ’Entre número de repetiç~oes:’<br />

READ(*,*) N<br />

CALL SUB1(X, SUB1)<br />

END PROGRAM MAIN<br />

-------------------------------------------<br />

SUBROUTINE SUB1(X, SUBMUDO)<br />

INTEGER N, X<br />

EXTERNAL SUBMUDO<br />

COMMON /GLOBALS/ N<br />

IF(X .LT. N)THEN<br />

X= X + 1<br />

PRINT*, ’X=’, X<br />

CALL SUBMUDO(X, SUBMUDO)<br />

END IF<br />

RETURN<br />

END SUBROUTINE SUB1<br />

Como a subrotina SUB1 não sabe que ao invocar o argumento mudo SUBMUDO, o qual é o nome de uma rotina<br />

externa, vai estar na verdade invocando a si própria, o compilador não irá gerar mensagem de erro e o código<br />

irá funcionar em grande parte das plataformas. Por exemplo, se o valor de N for definido igual a 5, o resultado<br />

será<br />

X = 1<br />

X = 2<br />

...<br />

X = 5<br />

o que demonstra que é possível simular-se recursividade mesmo em Fortran 77.<br />

Fortran 90/95<br />

Em Fortran 90/95, por outro lado, recursividade é suportada como um recurso explícito da linguagem.<br />

3 Ver, por exemplo, o texto de Clive Page [4, seção 4.3].<br />

4 Referência: Fortran Examples http://www.esm.psu.edu/~ajm138/fortranexamples.html, consultada em 07/06/2005.<br />

Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!