Funções recursivas

Discussão sobre avaliação de atividade acadêmica.

https://gist.github.com/zrhans/664f676f4b66adf549539ca2b788c6cd

Processo de compilação e execução

 
 zrhans:~/workspace/2017-2 $ gfortran denrlei-fatorial.f90
 zrhans:~/workspace/2017-2 $ ./a.out

========================================
 ****Utilize somente numeros inteiros****

Encontrar o valor fatorial do numero:
 ----------------------------------------

3
 3.00000000 ! = 6.00000000
 zrhans:~/workspace/2017-2 $

Observando o resultado, vemos que pode ser melhorado declarando variáveis do tipo integer​ ao invés de real. Já a questão do valor máximo para cálculo do fatorial, pode ser usado o especificados de entidade kind=16[1] para aproveitar o limite da capacidade computacional da arquitetura. Ver U3 – Tipos de dados.

Veja abaixo os resultados do cálculo do fatorial dos primeiros 100 inteiros, percebendo que para n=33 é o fatorial retorna o valor inteiro máximo para essa máquina[2]:

zrhans:~/workspace/2017-2 $ ./a.out
1 : 1
2 : 2
3 : 6
4 : 24
5 : 120
6 : 720
7 : 5040
8 : 40320
9 : 362880
10 : 3628800
11 : 39916800
12 : 479001600
13 : 6227020800
14 : 87178291200
15 : 1307674368000
16 : 20922789888000
17 : 355687428096000
18 : 6402373705728000
19 : 121645100408832000
20 : 2432902008176640000
21 : 51090942171709440000
22 : 1124000727777607680000
23 : 25852016738884976640000
24 : 620448401733239439360000
25 : 15511210043330985984000000
26 : 403291461126605635584000000
27 : 10888869450418352160768000000
28 : 304888344611713860501504000000
29 : 8841761993739701954543616000000
30 : 265252859812191058636308480000000
31 : 8222838654177922817725562880000000
32 : 263130836933693530167218012160000000
33 : 8683317618811886495518194401280000000
34 : -45049567881334322615755997788248211456
35 : 124676958757991025765413114570153656320
36 : 64699745315476902531002227912544878592
37 : 11914008226076149403460180741783027712
38 : 112449945669955213868112260755986841600
39 : -38122888843946684167491727129499926528
40 : -163786086074113512846170655452924215296
41 : 90417809380115242574495275065471401984
42 : 54441957834517090031680871000348557312
43 : -40972381562334372881344799007389515776
44 : -101372954138020089462298119166297636864
45 : -138112166238704000779545465870406909952
46 : 112205324517446769945026111164878159872
47 : 169414748505921235465608113272750342144
48 : -34868877818303820771801141270420652032
49 : -7163178492194900501382885091770892288
50 : -17876557688806561605769647156776402944
51 : 109142658633680748495871817299708084224
52 : -109381988704554957092033826755239215104
53 : -12445163685458847000424491687618805760
54 : 8525894827099188903826663732120911872
55 : 128641848569516926247091897834881941504
56 : 58013814553240137106279522686256283648
57 : -96036239674696819575813281201073946624
58 : -125584030397400119983176590753997520896
59 : 76754278814039117186822509013046919168
60 : -158696408050791457277893963261939810304
61 : -152574617312001916977042750888818507776
62 : 68280000442158124397838452982762438656
63 : -122030742116238187960047358698953113600
64 : 16526943742340630214585014197669593088
65 : 53404242489325573557902100553218916352
66 : 121856335086103220187792562194766364672
67 : -2402355333607370538888911313090641920
68 : -163360162685301196644445969290163650560
69 : -42533116894813274175409835772940910592
70 : 85223119651516978891682962780050161664
71 : -74241109319186841031252576388266328064
72 : 99157999753562861163808218953115762688
73 : 92604276670381132227133227510318235648
74 : 47069135189434515540366687128185208832
75 : 127361469998204030893755460296208547840
76 : 151565446077229370950925974422339715072
77 : 100938872634753805466563377840038871040
78 : 46737626329212166734327500592363077632
79 : -50833556122561926085248134952767193088
80 : 16703913246307474740644492959843090432
81 : -8112494732848399861294499979782520832
82 : 15340165748308138300600216521369714688
83 : -87895710574178374903680458453386526720
84 : 102972384029662704285082853414432407552
85 : -94688897423070185815697252999218855936
86 : 23531627718487142971026820429615464448
87 : 5557409982750657699085732785936138240
88 : 148769711561119414056169877730611953664
89 : -30507980976972224072490571814496370688
90 : -23459352559992458817154603850527670272
91 : -93106881433682971580821305807408726016
92 : -58773918875371798851194948487397507072
93 : -21456584674561877747136490419676774400
94 : 24775242116814272549417545140992475136
95 : -28328567349213352048955463628092342272
96 : 2716469843025911007272351157280833536
97 : -76784792147425095757956545175527358464
98 : -38697558187013188085500063702780477440
99 : -87952224383982522367385624825816940544
100 : 52119101546147813309177310644279443456

Alternativa de verificação:

...
integer(kind(16) :: maxint

if ( (fatorial(x) > 0) .and. (fatorial(x)<=huge(maxint) )

...

Referências

[1] StackOverflow – https://stackoverflow.com/q/47614227/824522
[2] The GNU Fortran Compiler – https://gcc.gnu.org/onlinedocs/gfortran/KIND-Type-Parameters.html