Buscando tutoriales ya no recuerdo de qué, me encontré con esto Van Eck Sequence Using Python - Roy Tutorials (roytuts.com)
¡La Secuencia de Van Eck! Este link también la menciona:
The Van Eck Sequence | IB Maths Resources from Intermathematics
Y ambos la explican de una forma horrible. En serio, a partir de esas explicaciones tan cutres intenté hacer mi propio algoritmo (sin mirar los de otros) y fue horrible. Tuve que ir a esta otra web Van Eck's sequence - EverybodyWiki Bios & Wiki y jugar un poco frustrarme dos horas armando mi propio código para hallar la verdadera explicación de cómo generar la secuencia de Van Eck:
1. Empieza con cero. En este ejercicio vamos a empezar siempre de cero.
2. Coge el último número de la secuencia.
3. Si ese número no se halla al menos dos veces en la secuencia, añade cero al final. Si se halla al menos dos veces, coge las dos últimas posiciones, réstalas, y el resultado se añade al final de la secuencia.
El código que me salió es:
No está mal porque una de las condiciones que me impuse es que no podía usar bucles anidados, es decir nada de:
Puedo generar una función que devuelve el último valor de la secuencia de forma indefinida. En casi todos los tutoriales que he revisado del uso de la palabra resevada yield se usa un bucle para mostrar cómo funciona. Esto no demuetra el poder de yield, el cual permite obtener un generador el cual devolverá el siguiente valor de la operación cuando se necesite, no es necesario que esté dentro de un bucle. yield permite que Python guarde el estado de todas las variables dentro de la función (que en este caso devuelve un generador), para que estén listas para la siguiente llamada next() del generador.
Codifiqué esto en Python 3.9 con Visual Code en Windows 10.