es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo estructurar un acumulador para fold_left con acceso de índice

Quiero escribir una función que tome una lista [a_n; a_n-1; ...; a_0] con un acumulador acc.

La función se supone que calculará la suma de cada elemento en toda la lista elevado a la potencia i-ésima. La función fold_left dará a f un número entero. La fórmula es acc + la suma desde i=0 hasta n de a_i ^ i. Mi problema es que en fold_left:

let fold_left f acc l = 
 match l with 
 | [] -> acc
 | x::xs -> fold_left f (f x acc) xs

el acumulador siempre devuelve un solo entero, por lo que no hay referencia para saber qué número es el elemento i-ésimo.

Entonces mi pregunta es cómo debo estructurar mi función f.

f debería estar estructurada así:

f a_0 (f a_1 (...(f a_n acc)...))

Intenté un enfoque imperativo usando una variable ref que almacena los valores anteriores que f ha calculado hasta ahora. Pero estoy seguro de que hay mejores soluciones para este problema…

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de estructurar la función f sería pasar un parámetro adicional para el índice i del elemento actual que se está procesando. Esto se puede hacer utilizando List.fold_lefti en lugar de List.fold_left. La función fold_lefti tiene la misma firma que fold_left, pero también pasa el índice del elemento que se está procesando.

    let f acc i x =
       acc + (x ** float_of_int(i))
    
    let my_sum = List.fold_lefti f 0 [a_n; a_n-1; ...; a_0]
    

    La función f toma tres parámetros: el acumulador actual (acc), el índice del elemento actual (i) y el propio elemento (x). Calcula la suma del elemento actual elevado a la potencia i y lo agrega al acumulador. De esta manera, f lleva un seguimiento del índice del elemento actual que se está procesando.

    Luego, puedes llamar List.fold_lefti con esta función para obtener el resultado deseado. El valor inicial del acumulador es 0.

    Este enfoque evita el uso de variables mutables como ref y sigue un estilo de programación funcional.

Comments are closed.