¿Hay alguna manera de definir un stream
con un algoritmo backtracking
en Scala?Cómo convertir el algoritmo de retroceso a la transmisión?
Por ejemplo, el siguiente algoritmo backtracking
imprime todas las cadenas "binarias" de un tamaño dado.
def binaries(s:String, n:Int) { if (s.size == n) println(s) else { binaries(s + '0', n) binaries(s + '1', n) } }
Creo que puedo definir un stream
de cadenas "binario" de un tamaño determinado usando otro algoritmo iterativo. Sin embargo, me pregunto si puedo convertir el algoritmo de retroceso anterior en un stream
.
Gracias, esto es exactamente lo que estoy buscando :) Parece más eficiente (en términos de consumo de memoria de pila) que la versión original de retroceso, ¿no? – Michael
@Michael Maybe. No me siento cómodo con la eficiencia de análisis del código con 'Stream'. Si considero que es necesario usarlos, me aseguro de probar el código en REPL para asegurarme de que no se desborde. –
@Michael, la versión de flujo es menos eficiente en términos de uso de marco de pila. Cada llamada recursiva usa 4 fotogramas de pila en comparación con solo uno en su versión. En la práctica, esto no debería ser un problema para este ejemplo. Con respecto al uso de la memoria de montón, la clase Stream es una de las menos eficaces de la colección scala en términos de uso de memoria por referencia almacenada, pero normalmente está bien si no se retiene accidentalmente en la cabecera de la secuencia ... – huynhjl