Problema valor de variável?

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 variáveis. 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 variável, 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?

Já tentei usar a e b como variáveis globais mas como nunca tinha tentado isso, não deu certo.

Oi @alessandra1408.

Quando postar código aqui, utilize as tags pra código, que fica mais fácil entender o que você fez.

O problema é que como a funçao gcd chama ela mesmo múltiplas vezes para chegar ao resultado, quando você chega na parte final onde tem resultado, nao existe mais disponível nas variáveis o valor inicial.

Uma opçao é ao invés de deixar o comando print dentro da funçao, deixe ele fora. Isso é o mais recomendado. Você ter uma funçao que só calcula o valor e outra que exibe o resultado.

  #ao invés de:
  print("o gdc entre {} e {} dá {} ".format(a, b, d))
  #use 
  return d

  #ao invés de:
  gdc(b, d)

  #use 
  return gdc(b, d)
  
  # a parte do else você pode remover pois nunca vai entrar ali.

  # e fora da funçao você chama:
  print("o gdc entre {} e {} dá {} ".format(a, b,  gdc(a,b) ))  

1 curtida

Entendi o que você falou, muito obrigada! Faz sentido. Mas, quando eu fui tentar ele diz que não está definido. Eu posso tentar fazer com que a e b sejam globais, mas daí eu não vou conseguir usar gdc com os argumentos a e b, e a função ficando sem argumentos eu n posso chamar dnv no “gdc(b,d)”.
O que eu faço :confused:

@alessandra1408
Boa noite amiga.
Escrevi um código para resolver o problema, porém não sei dizer se é a melhor solução.

def gdc(a, b):
    lista = []
    mmc = []
    saida = 0
    for q in range(0, 2):
        n = a if q == 0 else b
        d = 2
        r = n
        valores = []
        while r > 1:
            if r % d == 0:
                r = r/d
                valores.append(d)
            else:
                d += 1
        lista.append(valores)
    for n in lista[0]:
        if n in lista[1] and n not in mmc:
            mmc.append(n)
    for n in mmc:
        saida = saida * n if saida > 0 else n
    return "O gdc entre {} e {} da {} ".format(a, b, saida)

print(gdc(48,30)) 

Espero que ajude.

Muito obrigada pela ajuda, de verdade mesmo, mas eu to começando agora com python e não entendi muito bem o reu código. To tentando fazer algo mais fácil.
Vou seguir tentando e quem sabe eu entenda teu código! :slight_smile:

Boa tarde…kkkkkkkkkk…entendi qual o seu problema com o meu e o seu código e esqueci de explicar…kkkkkkkkk…depois eu edito o código colocando os comentários.

o seu problema de troca de valores acontece pq faz a recursão do método e isso faz a troca dos valores.

o meu código faz a decomposição dos valores com o MMC, encontra os divisores comuns com o menor expoente, multiplica os valores entre eles e devolve dentro da variável de saída.

1 curtida

Heheheh, obrigada pq eu acho que eu nunca iria entender e.e
Ps: n sei como por em formato de código aqui, mas enfim hehe.

Acho que realmente desse jeito meu n vai funcionar ksk. Mas segue o que eu fiz agr

a = 0
b = 0
Def gdc(a, b):
if a > b:
d = a - b
h = b%d
if h != 0:
return gdc(b, d)
elif h == 0:
return d
else:
print(“deu zebra”)

gdc(48,30)
print(“o gdc entre {} e {} deu {}”.format(a, b, gdc(a, b)))

Fiz a e b = 0 pra o print fora da função poder chamar essas variáveis, pq n tava dando antes. Mas agora ele retorna no print 0,0 e None pq ele n ta pegando os valores “novos” de a, e sim os que eu passei antes de fazer a função.
O que eu faço ksksk

def gcd (a, b):
    if b == 0: # caso base 
        return a
    return gcd(b, a % b) # gcd(a,b) = gcd(b, r), onde r = a % b
1 curtida