web-dev-qa-db-fra.com

Comment écrire 2 ** n - 1 comme fonction récursive?

J'ai besoin d'une fonction qui prend n et renvoie 2n - 1. Cela semble assez simple, mais la fonction doit être récursive. Jusqu'à présent, je n'ai que 2n:

def required_steps(n):
    if n == 0:
        return 1
    return 2 * req_steps(n-1)

L'exercice indique: "Vous pouvez supposer que le paramètre n est toujours un entier positif et supérieur à 0"

49
Kajice

En utilisant un paramètre supplémentaire pour le résultat, r -

def required_steps (n = 0, r = 1):
  if n == 0:
    return r - 1
  else:
    return required_steps(n - 1, r * 2)

for x in range(6):
  print(f"f({x}) = {required_steps(x)}")

# f(0) = 0
# f(1) = 1
# f(2) = 3
# f(3) = 7
# f(4) = 15
# f(5) = 31

Vous pouvez également l'écrire en utilisant le décalage gauche au niveau du bit, << -

def required_steps (n = 0, r = 1):
  if n == 0:
    return r - 1
  else:
    return required_steps(n - 1, r << 1)

La sortie est la même

0
Thank you

Avoir un espace réservé pour mémoriser la valeur d'origine de n, puis pour la toute première étape, c'est-à-dire n == N, revenir 2^n-1

n = 10
# constant to hold initial value of n
N = n
def required_steps(n, N):
    if n == 0:
        return 1
    Elif n == N:
        return 2 * required_steps(n-1, N) - 1
    return 2 * required_steps(n-1, N)

required_steps(n, N)
0
eMad