1
resposta

Contando o número de operações executadas sobre uma mesma entrada para uma chamada recursiva

ideia: Comparar uma versão recursiva da implementação da exponenciação com a não-recursiva.

Versão recursiva:

def power(base,expoente):
    global cont

    if base == 1:
        return 1
    elif expoente == 0:
        return 1
    else:
        cont +=1
        return base*power(base,expoente-1), cont

#print(power(1,1000))
print(power(3,4))

A variável cont contaria o número de multiplicações. Estou recebendo o erro:

NameError: name 'cont' is not defined

embora seja uma variável definida como global. O que está errado?

Como contar o número de multiplicações efetuadas?

1 resposta

Olá Edson,

Primeiro para utilizar a variável cont como global você precisa criar ela antes de chamar a função.

Segundo, quando você utiliza o return base*power(base,expoente-1), cont você está retornando uma tupla (algo como (2, 1)), o que atrapalha a multiplicação. Não é necessário retornar o valor de cont já que está como global, então o , cont pode ser removido.

def power(base, expoente):
    global cont

    if base == 1:
        return 1
    elif expoente == 0:
        return 1
    else:
        cont += 1
        # removido o ", cont"
        return base * power(base, expoente - 1)

# inicialização da variável cont
cont = 0
print(power(3, 4))
print(cont)

# Resultado
81
4

Um detalhe é que já que cont é global, chamar a função mais de uma vez vai continuar aumentando o valor de cont:

cont = 0
print(power(2, 10), cont, sep=', ')
print(power(3, 4), cont, sep=', ')

# Resultado
1024, 10
81, 14

Mas para evitar isso é só resetar o valor de cont novamente:

cont = 0
print(power(2, 10), cont, sep=', ')
cont = 0
print(power(3, 4), cont, sep=', ')

# Resultado
1024, 10
81, 4

Espero ter ajudado, qualquer dúvida é só falar!