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.

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    stock = [17,3,6,9,15,8,6,1,10]
    best_profit = 0
    days = []
    
    (stock.length - 1).times do |day|
      profit = stock[(day+1)..-1].reduce(stock[day]) do |acc, val|
        current_profit = val - acc
        if current_profit > best_profit
          best_profit = current_profit
          days = [day, stock.index(val)]
        end
        acc
      end
    end
    
    puts "Mejores días para comprar y vender: #{days}, con una ganancia de $#{best_profit}."
    

    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. Pasamos stock[day] como valor inicial al método reduce, lo cual establece el valor inicial de acc en cada iteración. También utilizamos stock[(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, calculamos current_profit como val - acc y actualizamos days y best_profit en consecuencia.

Comments are closed.