def unfold(f, x):
while x is not None:
yield x
x = f(x)
def next_elem(t):
(a, b, c, d) = t
return (b, c, d, a*(a+1))
logical = unfold(next_elem, (4, 5, 6, 8))
for n in logical:
print(n)
if n[-1] > 1000:
break
ZGVmIHVuZm9sZChmLCB4KToKCXdoaWxlIHggaXMgbm90IE5vbmU6CgkJeWllbGQgeAoJCXggPSBmKHgpCgpkZWYgbmV4dF9lbGVtKHQpOgoJKGEsIGIsIGMsIGQpID0gdAoJcmV0dXJuIChiLCBjLCBkLCBhKihhKzEpKQoKbG9naWNhbCA9IHVuZm9sZChuZXh0X2VsZW0sICg0LCA1LCA2LCA4KSkKCmZvciBuIGluIGxvZ2ljYWw6CglwcmludChuKQoJaWYgblstMV0gPiAxMDAwOgoJCWJyZWFr
(4, 5, 6, 8)
(5, 6, 8, 20)
(6, 8, 20, 30)
(8, 20, 30, 42)
(20, 30, 42, 72)
(30, 42, 72, 420)
(42, 72, 420, 930)
(72, 420, 930, 1806)