Problema ao exibir variavel

1. Problema ao exibir variavel

Alessandra Fernandes
Aleh1408

(usa Ubuntu)

Enviado em 18/04/2019 - 15:16h

Olá, estou aprendendo python a bem pouco tempo e tive problemas com um exercício. segue abaixo ele:

O maior divisor comum (MDC, ou GCD em inglês) de a e b é o maior número que divide ambos sem sobrar resto.
Um modo de encontrar o MDC de dois números é observar qual é o resto r quando a é dividido por b, verificando que gcd(a, b) = gcd(b, r). Como caso-base, podemos usar gcd(a, 0) = a.
Escreva uma função chamada gcd que receba os parâmetros a e b e devolva o maior divisor comum.

consegui fazer mas toda vez que eu vou exibir o valor de "a" e "b" que eu escolhi me é retornado os novos valores dessas variaveis. segue o código:


#Exercício 6.5

def gdc(a, b):
if a > b:
d = a - b
h = b%d
if h != 0:
gdc(b, d)
elif h == 0:
print("o gdc entre {} e {} dá {} ".format(a, b, d))
else:
print("deu zebra")


gdc(48, 30)


em vez de printar "o gdc entre 48 e 30 dá 6", ele exibe "o gdc entre 18 e 12 dá 6 ", sendo 18 e 12 os últimos 2 números utilizados nessa função. já tentei de varias modos, mas no geral sempre caio nesse erro ou em uma recursividade infinita...
o que quero é que seja exibido o valor inicial da variavel, o a = 48 e b = 30 que foram inseridos para chamar a função.
alguém pode me ajudar a resolver isso de modo que fique semelhante ao que eu estou tentando fazer???
muito obrigada mesmo!!!


  


2. Re: Problema ao exibir variavel

Rodrigo
omag0

(usa Debian)

Enviado em 18/04/2019 - 17:35h

Você terá mais sorte com esse tipo de perguntas no StackOverflow ou no GUJ.



3. Re: Problema ao exibir variavel

Moises Viana Felipe
viana3

(usa openSUSE)

Enviado em 19/04/2019 - 09:37h

Aparentemente a um outro problema com o seu código, ao entrar com os dados gcd(8,2) ele retorna "deu zebra", a resposta deveria ser 2.


4. Re: Problema ao exibir variavel

Alessandra Fernandes
Aleh1408

(usa Ubuntu)

Enviado em 21/04/2019 - 10:00h

viana3 escreveu:

Aparentemente a um outro problema com o seu código, ao entrar com os dados gcd(8,2) ele retorna "deu zebra", a resposta deveria ser 2.


É que eu não fiz essa parte ainda, quando b é maior do que a. Porque eu quero que funcione primeiro a outra parte. Ali no início eu botei:
if a > b:
Pq com gdc(8,2) vai chegar em uma divisão 2/6 e eu não estabeleci isso ainda.


5. Re: Problema ao exibir variavel

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/04/2019 - 11:44h

Em vez de fazer a função imprimir o resultado, faça-a apenas retornar tal resultado, e imprima-o a partir do ponto que chamou originalmente a função.
print 'O MDC entre 48 e 30 é ', gdc(48, 30) 


Obviamente, a função também terá de ser alterada.
def gdc(a, b):
def gdc_safe(a, b):
r = a % b
return b if r==0 else gdc_safe(b, r)

a=abs(a)
b=abs(b)

if a==0:
return 'infinito' if b==0 else b
elif b==0:
return a
elif b>a:
return gdc_safe(b, a)
else:
return gdc_safe(a, b)



... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)


6. Re: Problema ao exibir variavel

Moises Viana Felipe
viana3

(usa openSUSE)

Enviado em 21/04/2019 - 18:01h

Aleh1408 escreveu:

viana3 escreveu:

Aparentemente a um outro problema com o seu código, ao entrar com os dados gcd(8,2) ele retorna "deu zebra", a resposta deveria ser 2.


É que eu não fiz essa parte ainda, quando b é maior do que a. Porque eu quero que funcione primeiro a outra parte. Ali no início eu botei:
if a > b:
Pq com gdc(8,2) vai chegar em uma divisão 2/6 e eu não estabeleci isso ainda.



def gdc(a , b):
d = a % b
if(d > 0):
d = gdc(b,d)
else:
print("o mdc é",b)

Caso prefira, teste a versão acima, que em meus testes funciona corretamente tanto com a > b como com a < b, e depois siga dica do paulo1205 .


7. Re: Problema ao exibir variavel

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/04/2019 - 01:20h

viana3 escreveu:

Caso prefira, teste a versão acima, que em meus testes funciona corretamente tanto com a > b como com a < b, e depois siga dica do paulo1205 .


Você tem razão num ponto: a>b ou b>a dá o mesmo resultado. Só que b>a tem um cálculo de divisão a mais e uma chamada recursiva a mais do que a>b.

Em função disso, eu diria que é provável que o teste “elif b>a” e a consequente inversão dos argumentos acabe saindo mais barata do que a iteração com divisão a mais.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts