Рекурсивное расширение списка в python

Я пытался сделать свой код более питоническим и задавался вопросом, есть ли способ каким-то образом сделать эту одну строку.

w=[1, 0, 0, 0, 0, 0, 0, 0] # just an example
for i in range(170):
    w.append(w[-2]^w[-3]^w[-4]^w[-8])

Я попытался использовать лямбда-нотацию и получил это, но это не работает для длин больше, чем около 50.

[(lambda a:lambda v:a(a,v))(lambda s,x:1 if x==0 else (0 if x < 8 else s(s,x-2)^s(s,x-3)^s(s,x-4)^s(s, x-8)))(k) for k in range(170)]

Я также попытался рекурсивно использовать списки:

(lambda n: (lambda f, n: f(f, n))(lambda f, n: f(f, n-1)+[f(f, n-1)[-2]^f(f, n-1)[-3]^f(f, n-1)[-4]^f(f, n-1)[-8]] if n > 0 else [1,0,0,0,0,0,0,0], n))(20)

Я думаю, что любой из них будет работать с мемуаризацией, но я не уверен, как сделать это встроенным, если это вообще возможно.

1 ответ

  1. Я думаю, что у вас есть хорошо, но, возможно, превратить его в генератор, как:

    def running_xor(w, n):
        for i in range(n):
            yield w[-2]^w[-3]^w[-4]^w[-8]
    
    w.extend(running_xor(w, 170))