¿El método reduce en el ejercicio de seleccionador de acciones?
El problema proporciona un array donde cada índice es el precio de una acción en cada día:
array = [17,3,6,9,15,8,6,1,10]
Por ejemplo, el 1 de noviembre el precio es de $17, el 2 de noviembre el precio es de $3, el 3 de noviembre el precio es de $6, etc.
Tengo que encontrar los mejores días para comprar y vender, por lo que debería devolver [#{día de compra}, #{día de venta}]
La respuesta correcta en este caso es [1, 4] para obtener una ganancia de $12 (comprar a $3 y vender a $15). Para hacer esto, utilicé el método reduce y funciona bien, pero me dijeron que no estoy utilizando el método reduce correctamente.
stock = [17,3,6,9,15,8,6,1,10]
stocks_new = [17,3,6,9,15,8,6,1,10]
best_profit = 0
days = []
stock.length.times do |day|
stocks_new.reduce do |acc, val|
acc = stocks_new[0]
profit = val - acc
if profit > best_profit
best_profit = profit
days = [stock.index(acc), stock.index(val)]
end
end
stocks_new.shift
end
Primero copié el array en otra variable (stocks_new) y hago un shift al final de cada bucle. Hago esto para evitar que el val en |acc, val| comience detrás del acumulador en la iteración.
¿Hay alguna manera de configurar el val en el método reduce para que comience desde el índice acc + 1 en cada iteración, de modo que no tenga que crear este array stocks_new y hacer un shift cada vez?
davy.ai
Sí, hay una forma de configurar el valor en el método reduce para que comience desde el índice acc + 1 en cada iteración. Puede pasar un valor inicial al método reduce como segundo argumento, lo cual establecerá el valor inicial del acumulador. Puede pasar un valor de índice al método reduce como valor inicial, lo cual establecerá el índice de inicio para val como acc+1 en cada iteración. Aquí tienes un ejemplo de fragmento de código:
En este código actualizado, utilizamos
(stock.length - 1)
para iterar a través de todas las posibles combinaciones de días de compra y venta. Pasamosstock[day]
como valor inicial al método reduce, lo cual establece el valor inicial de acc en cada iteración. También utilizamosstock[(day+1)..-1]
para crear una nueva matriz que comienza desde el día siguiente al día actual, la cual sirve como matriz de valores para val en cada iteración. Por último, calculamoscurrent_profit
comoval - acc
y actualizamosdays
ybest_profit
en consecuencia.