Soy nuevo en la programación funcional, por lo que algunos problemas parecen ser más difíciles de resolver con un enfoque funcional.Continuar con la información sobre cómputos anteriores
Digamos que tengo una lista de números, como 1 a 10.000, y quiero obtener los elementos de la lista que suman como máximo un número n (digamos 100). Entonces, obtendría los números hasta que su suma sea mayor que 100.
En la programación imperativa, es trivial resolver este problema, porque puedo mantener una variable en cada interacción y detenerme una vez que se alcanza el objetivo.
Pero, ¿cómo puedo hacer lo mismo en la programación funcional? Dado que la función de suma opera en listas completadas, y todavía no tengo la lista completa, ¿cómo puedo 'continuar' el cálculo?
Si suma se calculó con pereza, podría escribir algo así:
(1 to 10000).sum.takeWhile(_ < 100)
PS: A pesar de que será apreciado ninguna respuesta, me gustaría que no computa la suma cada vez, ya obviamente la versión imperativa será mucho más óptima con respecto a la velocidad.
Editar:
sé que puedo "convertir" el enfoque de bucle imprescindible para una función recursiva funcional. Estoy más interesado en encontrar si una de las funciones de biblioteca existentes puede proporcionarme una manera de no escribir una cada vez que necesite algo.
Probablemente el más fácil de usar un acumulador variable. '{var sum = 0; (1 a 10000) takeWhile {i => suma + = i; suma <100}} '. No tiene nada de malo tener una 'var' aquí; no puede escapar porque la expresión tiene '{}' a su alrededor. –
¿Por qué crees que escribir una función "cada vez que necesitas algo" es menos natural que escribir un ciclo imperativo cada vez que necesitas algo? – Ben