Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
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