Interpretador Hall - Calculando o MDC Veja no exemplo abaixo um algoritmo para se calcular o MDC (Maior Divisor Comum) entre dois números inteiros e positivos. O algoritmo implementa o método de Euclides (+- 300 anos A.C.). O MDC – Maior Divisor Comum O maior divisor comum de dois números inteiros a e b é o maior número inteiro que divide ambos simultâneamente. A notação disto geralmente é mdc(a,b) e, algumas vezes, simplesmente (a,b). Algoritmo de Euclides O Algoritmo de Euclides para calcular o maior divisor comum de dois números inteiros diferentes de zero baseia-se no seguinte fato: “Se r é o resto, quando a é dividido por b então o máximo divisor comum de a e b é igual ao máximo divisor comum de b e r” isto é, se r = Resto(a,b) então MDC(a,b) = MDC(b,r). Essa regra define um algoritmo para se calcular o MDC entre dois números (inteiros e positivos). Calculando o MDC - versão 1 algoritmo() { inteiro a,b,c; leia ("informe o valor de a: ",a); leia ("informe o valor de b: ",b); // os valores nao podem ser negativos a := ValorABS(a); b := ValorABS(b); enquanto (b <> 0) { c = Resto(a,b); a = b; b = c; } escreva ("O MDC entre a e b e ", a); } Interpretador Hall 1 No exemplo abaixo um algoritmo para se calcular o MDC (Máximo Divisor Comum) entre dois números inteiros e positivos é implementado através de uma função de usuário. (uma função criada por você mesmo) Calculando o MDC – versão 2 algoritmo() { inteiro a,b,c; leia ("informe o valor de a: ",a); leia ("informe o valor de b: ",b); c := CalcMDC(a,b); escreva ("O MDC entre a e b e ", c); } //-----------------------------------------------------------------------------------funcao CalcMDC (inteiro x, inteiro y) { inteiro r; // os valores nao podem ser negativos x := ValorABS(x); y := ValorABS(y); enquanto (y <> 0) { r = Resto(x,y); x = y; y = r; } retorne x; } Interpretador Hall 2 No exemplo abaixo um algoritmo para se calcular o MDC (Máximo Divisor Comum) entre dois números inteiros e positivos é implementado através de uma função de usuário recursiva. Calculando o MDC – versão 3 algoritmo() { inteiro a,b,c; leia ("informe o valor de a: ",a); leia ("informe o valor de b: ",b); x := ValorABS(x); y := ValorABS(y); c := CalcMDC(a,b); escreva ("O MDC entre a e b e ", c); } //-----------------------------------------------------------------------------------funcao CalcMDC (inteiro x, inteiro y) { se ( Resto(x,y) == 0 ) { retorne y; } senao { retorne CalcMDC(y,Resto(x,y)); } } Interpretador Hall 3 No exemplo abaixo o algoritmo para se calcular o MDC (Máximo Divisor Comum) entre dois números inteiros e positivos é implementado através da função interna do interpretador. O interpretador Hall disponibiliza uma função de nome MDC que espera receber dois argumentos do tipo inteiro e positivos. Calculando o MDC – versão 4 algoritmo() { inteiro a,b,c; leia ("informe o valor de a: ",a); leia ("informe o valor de b: ",b); x := ValorABS(x); y := ValorABS(y); c := MDC(a,b); escreva ("O MDC entre a e b e ", c); } Interpretador Hall 4 No exemplo abaixo o algoritmo para se calcular o MDC (Máximo Divisor Comum) entre vários números inteiros e positivos é implementado através da função interna do interpretador. O interpretador Hall disponibiliza uma função de nome MDC que espera receber dois argumentos do tipo inteiro e positivos. Calculando o MDC – versão 5 algoritmo() { inteiro a,b,c,d,e; leia leia leia leia ("informe ("informe ("informe ("informe o o o o valor valor valor valor de de de de a: ",a); b: ",b); c: ",c); d: ",d); a := ValorABS(a); b := ValorABS(b); c := ValorABS(c); d := ValorABS(d); e := MDC(a,b); e := MDC(e,c); e := MDC(e,d); escreva ("O MDC entre a,b,c e d: ", e); } Interpretador Hall 5 No exemplo abaixo o algoritmo para se calcular o MDC (Máximo Divisor Comum) entre vários números inteiros e positivos é implementado através da função interna do interpretador. O interpretador Hall disponibiliza uma função de nome MDC que também pode receber uma lista de valores, inteiros e positivos, separados por vírgulas. Calculando o MDC – versão 6 algoritmo() { inteiro a,b,c,d,e; leia leia leia leia ("informe ("informe ("informe ("informe o o o o valor valor valor valor de de de de a: ",a); b: ",b); c: ",c); d: ",d); a := ValorABS(a); b := ValorABS(b); c := ValorABS(c); d := ValorABS(d); e := MDC (a, MDC (b, MDC (c,d) ) ); escreva ("O MDC entre a,b,c e d: ", e); } Comentário: Observe a instrução e := MDC (a, MDC (b, MDC (c,d) ) ); O interpretador Hall permite o empilhamento de chamadas de função. É exatamente o que a instrução acima faz. A primeira parte a ser executada é a instrução mais interna, no caso MDC(c,d). Assim que o sistema retorna dessa chamada, a instrução seguinte é chamada, a saber MDC (b, MDC(c,d) ) só que agora, a expressão MDC(c,d) já tem um valor conhecido, digamos k1, de modo que a instrução a ser executada é: MDC(b,k1). Finalmente, a última instrução, MDC (a, MDC (b,k1)) é executada sendo que a expressão MDC(b,k1) agora tem um valor conhecido, digamos k2. Assim a expressão a ser avaliada é MDC(a,k2). Por isso é denominada de pilha de execução. A sequência de execução acontece no modo FILO (first-in, last-out), primeiro a entrar (empilhar) é o último a sair (desempilhar). A sequência de execução é... MDC(c,d) MDC (b,MDC(c,d)) Interpretador Hall MDC (a,MDC(b,MDC(c,d))) 6 No exemplo abaixo (último) demonstra-se uma outra forma de se chamar a função interna MDC para se calcular o máximo divisor comum de uma série de números (inteiros e positivos). (talvez a forma mais simples) O interpretador Hall disponibiliza uma função de nome MDC que também pode receber uma lista de valores, inteiros e positivos, separados por vírgulas. Calculando o MDC – versão 7 algoritmo() { inteiro a,b,c,d,e; leia leia leia leia ("informe ("informe ("informe ("informe o o o o valor valor valor valor de de de de a: ",a); b: ",b); c: ",c); d: ",d); a := ValorABS(a); b := ValorABS(b); c := ValorABS(c); d := ValorABS(d); e := MDC (a,b,c,d); escreva ("O MDC entre a,b,c e d: ", e); } Nota: O pseudo-código do algoritmo de Euclides pode ser visto abaixo. AlgoritmoDeEuclides(inteiro a, inteiro b) dividendo ← a divisor ← b enquanto resto(dividendo/divisor) ≠ 0 c ← resto(dividendo/divisor) dividendo ← divisor divisor ← c retornar divisor That's All Folks! Interpretador Hall 7