def trace(func): def wrapper(*args): print(' ' * wrapper.space, end = '') print('{} <- {}'.format(func.__name__, str(args))) wrapper.space += 1 val = func(*args) wrapper.space -= 1 print(' ' * wrapper.space, end = '') print('{} -> {}'.format(func.__name__, str(args))) return val wrapper.space = 0 return wrapper @trace def puissance(a, n): if n == 0: return 1 return a * puissance(a, n-1) print(puissance(5, 10)) @trace def expoR(a, n): if n == 0: return 1 y = expoR(a, n // 2) if n % 2 == 0: return y * y else: return y * y * a print(expoR(5, 10))