Это, вероятно, должно работать.
def number(n):
ys = []
for xs in range(n,0,-1):
if 2**xs <= n:
ys.append(2**xs)
n -= 2**xs
xs -= 1
return ys[::-1]
Вы продолжали проверять тот же n, но каждый раз, когда вы добавляете новый элемент в свой ys, вы должны вычитать его из числа n.
Кроме того, работа от высокой до низкой может сделать вещи проще.
И, наконец, инвертированный срез в конце только для того, чтобы он вернулся в том порядке, который вы просили. Вы можете оставить это, и оно вернется [16, 4, 2].